2014-03-31 45 views
3

什么是在视图中的模型对象与外键引用用户分配从django.contrib.auth.models用户对象的正确方法?实施例new_contact中:无法分配django.utils.functional.SimpleLazyObject,必须是用户实例

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(请求)根据答案在这里:valueError in modelforms],它返回NameError“权威性”即使我进口django.contrib.auth进入我的视野。什么是正确的方法来做到这一点?感谢

我的ModelForm是:

from django import forms 
from .models import Contact 

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

你登录了吗? – karthikr

回答

7

import语句应该是:

from django.contrib.auth import get_user 

和实际调用get_user()

new_contact.user = get_user(request) 

仅供参考,引自django.contrib.authsource

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

希望有所帮助。

+0

请注意,get_user仅在Django 1.5+中可用。 –

0

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

,最好的办法是继承自contrib.auth.forms现有UserCreationForm并添加字段它。

+0

他没有创建用户记录,所以他不会使用UserCreationForm。他正在创建一个将用户作为外键的联系人记录。 'request.user'对应于登录用户。你要么没仔细看这个问题还是不明白懒惰评价的概念 - 当他说的用户记录不存在,他的意思是,因为它是一个懒洋洋地评估对象,它的存在是一个包装到实际的对象,应该在需要时返回。 –

相关问题