2013-07-19 35 views
1

我有一个函数允许您创建一条消息并发送它。我有一个叫做person的Usermodel,它有一个叫做inbox的属性。该属性确定用户是否想要启用他的收件箱。在django表单中传递request.user错误

我有一个叫做NewMessageForm的窗体。我试图通过表单提出错误,如果已验证的用户将他的收件箱停用,但为了这样做,我必须通过不允许我这样做但仅在视图中的表单来获取request.user。

有人可以帮助我。

global name 'request' is not defined 

File "C:\mysite\pet\forms.py" in clean_recipient 
    329.    user = User.objects.get(user=request.user) 

Exception Type: NameError at /create/ 
Exception Value: global name 'request' is not defined 

车型

class Person(models.Model): 

inbox = (
     ('A', 'Activate'), 
     ('D', 'Deactivate'), 
     ('F', 'Permit To Friends Only'), 
) 

    user = models.ForeignKey(User) 
    inbox = models.CharField(max_length=1, choices=inbox ,default='A') 

    def __unicode__(self): 
     return self.user.username 


class Thread(models.Model): 
    subject = models.CharField(max_length=100, blank=True) 
    user = models.ForeignKey(User) 


class Message(models.Model): 
    user = models.ForeignKey(User, related_name='sender') 
    recipient = models.ForeignKey(User, related_name='recipient') 
    created = models.DateTimeField(auto_now_add=True) 
    body = models.CharField(max_length=1000) 
    read = models.BooleanField(default=False) 
    sentmessage = models.BooleanField(default=False) 
    thread = models.ForeignKey(Thread) 
    draft = models.BooleanField(default=False) 

    def __unicode__(self): 
     return self.body 

形式

class NewMessageForm(forms.ModelForm): 
    recipient = forms.CharField(required=False,max_length=15) 
    message = forms.CharField(widget=forms.Textarea,required=True,max_length=15) 

    def clean_recipient(self): 

      recipient = self.cleaned_data['recipient'] 
      user = User.objects.get(user=request.user) 
      if person.inbox == D: 
        raise forms.ValidationError("You have deactivated your inbox , Please enable it at profile settings") 
      if recipient: 
       try: 
        recipient = User.objects.get(username=recipient) 
       except User.DoesNotExist: 
        raise forms.ValidationError("This username does not exist") 
       return recipient 
      else: 

       return recipient 

意见

@login_required 
def Create(request): 
    person = Person.objects.get(user=request.user) 
    form = NewMessageForm() 
    if request.POST.get('_send', False): 
     form = NewMessageForm(request.POST) 
     if form.is_valid(): 
      recipient = form.cleaned_data['recipient'] 
      subject = form.cleaned_data['subject'] 
      message = form.cleaned_data['message'] 
      if recipient: 
       thread = Thread.objects.create(subject=subject,user=request.user) 
       recipient = User.objects.get(username=recipient) 
       message = Message.objects.create(user=request.user,recipient=recipient,body=message,thread=thread,sentmessage=True,read=False) 
       return HttpResponseRedirect(reverse('world:message')) 
    return render(request,'create.html',{'messages':messages,'form':form,'person':person}) 

回答

1

你可以覆盖__init__的形式,要求请求参数:

class NewMessageForm(forms.ModelForm): 

    def __init__(self, request, *args, **kwargs): 
     self.request = request 
     super(NewMessageForm, self).__init__(*args, **kwargs) 

你实例化形式,您的看法是这样的:

form = NewMessageForm(request) 

form = NewMessageForm(request, request.POST) 

现在你有你的NewMessageForm实例self.request,并且可以使用self.request.user从它。

+0

谢谢,请问为什么django不允许request.user在表单中? – JackRoster

+0

,因为请求仅在默认情况下在视图中可用。如果您打算不仅在表单中而且在其他地方使用请求对象,则可以查看https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py这是一个在线程中保存请求的中间件,您可以在任何地方轻松导入。但要小心,Django社区中的一些用户可能认为这种方法很糟糕。 – mawimawi

+0

非常感谢您的帮助 – JackRoster