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

时间:2014-03-31 18:13:56

标签: python django django-forms django-views

在视图中将django.contrib.auth.models中的User对象分配给具有外键引用用户的模型对象的正确方法是什么?示例中的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 at /不能分配"":" Contact.user"必须是"用户" instance因为request.user是一个对象包装器,而不是实际的User(它还没有存在)。但是如果我设置new_contact.user = auth.get_user(request)[基于这里的答案:valueError in modelforms],它会返回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 :(得分:8)

import语句应为:

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

希望有所帮助。

答案 1 :(得分:0)

你错过了一步,不知何故。你说用户还不存在,但那是因为你没有任何创建它的代码。你需要这样做 - 它不会为你做。

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