【问题标题】:Cannot assign django.utils.functional.SimpleLazyObject, must be user instance无法分配 django.utils.functional.SimpleLazyObject,必须是用户实例
【发布时间】:2014-03-31 18:13:56
【问题描述】:

将视图中的 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”必须是“用户”实例,因为 request.user 是一个对象包装器,而不是实际的用户(它不'还不存在)。但是,如果我设置 new_contact.user = auth.get_user(request) [基于此处的答案:valueError in modelforms],即使我将 django.contrib.auth 导入到我的视图中,它也会返回 NameError 'auth'。这样做的正确方法是什么?谢谢

我的模型是:

from django import forms
from .models import Contact

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

【问题讨论】:

    标签: python django django-forms django-views


    【解决方案1】:

    导入语句应该是:

    from django.contrib.auth import get_user
    

    以及对get_user()的实际调用:

    new_contact.user = get_user(request)
    

    仅供参考,引用自django.contrib.auth source

    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.
        """
        ...
    

    希望对您有所帮助。

    【讨论】:

    • 请注意,get_user 仅在 Django 1.5+ 中可用。
    【解决方案2】:

    不知何故,您在这里遗漏了一步。你说用户还不存在,但那是因为你没有任何代码来创建它。你需要这样做 - 它不会为你完成。

    最好的方法是从 contrib.auth.forms 继承现有的 UserCreationForm 并将您的字段添加到其中。

    【讨论】:

    • 他没有创建用户记录,所以他不会使用 UserCreationForm。他正在创建一个以用户为外键的联系人记录。 request.user 对应登录用户。你要么没有仔细阅读这个问题,要么没有理解惰性求值的概念——当他说用户记录还不存在时,他的意思是因为它是一个惰性求值对象,它作为实际对象的包装存在,应该在需要时返回。
    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 2021-11-18
    • 1970-01-01
    • 2011-02-22
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多