2013-07-19 38 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