无法分配django.utils.functional.SimpleLazyObject,必须是用户实例

4 投票
2 回答
3337 浏览
提问于 2025-04-18 00:43

在视图中,如何正确地将一个来自django.contrib.auth.models的用户对象分配给一个有外键指向用户的模型对象呢?比如说,新的联系人对象new_contact:

def index(request):
    form = SignupForm(request.POST or None)
    if form.is_valid():
        new_contact = form.save(commit=False)
        new_contact.user = request.user
        new_contact.save()
        # send_mail ...
        return HttpResponseRedirect(reverse('app:template'))
    else:
        return render_to_response('index.html', {'form': form}, context_instance=RequestContext(request))

当我尝试用"new_contact.user = request.user"时,出现了错误:ValueError,提示“不能分配空值:'Contact.user'必须是一个'User'实例,因为request.user是一个对象包装,而不是实际的用户(这个用户还不存在)”。但是如果我用new_contact.user = auth.get_user(request)来设置(这个方法是根据这里的回答:modelforms中的valueError),却返回了NameError 'auth',尽管我已经在视图中导入了django.contrib.auth。那我该怎么做呢?谢谢!

我的模型表单是:

from django import forms
from .models import Contact

class SignupForm(forms.ModelForm):
 class Meta:
    model = Contact
    fields = ['name','email','company']

2 个回答

0

你这里缺少了一步。你说用户还不存在,但其实是因为你没有任何代码来创建这个用户。你需要自己去做这件事——这不会自动帮你完成。

最好的方法是从现有的 UserCreationForm(在 contrib.auth.forms 里面)继承一个新的类,然后在这个类里添加你需要的字段。

8

导入语句应该是:

from django.contrib.auth import get_user

然后实际调用 get_user() 的方式是:

new_contact.user = get_user(request)

顺便提一下,来自 django.contrib.auth 的引用 源代码

def get_user(request):
    """
    Returns the user model instance associated with the given request session.
    If no user is retrieved an instance of `AnonymousUser` is returned.
    """
    ...

希望这些对你有帮助。

撰写回答