2011-02-25 152 views
26

可能重複:
get request data in Django form獲取當前用戶

有我的客戶模型的一部分:

class Guest(models.Model): 
    event = models.ForeignKey(Event, related_name='guests') 
    user = models.ForeignKey(User, unique=True, related_name='guests') 
    ... 

形式來從客戶的反應:

class RSVPForm(forms.Form): 
    attending_d= forms.ChoiceField(choices=VISIBLE_ATTENDING_CHOICES, initial='yes', widget=forms.RadioSelect) 
    attending_b = forms.ChoiceField(choices=VISIBLE_ATTENDING_CHOICES, initial='yes', widget=forms.RadioSelect) 
    number_of_guests = forms.IntegerField(initial=0) 
    comment = forms.CharField(max_length=255, required=False, widget=forms.Textarea) 

    ....  

    def save(self): 
     guest = self.guest_class.objects.get(user=1) 
     guest.attending_status_d = self.cleaned_data['attending_d'] 
     guest.attending_status_b = self.cleaned_data['attending_b'] 
     guest.number_of_guests = self.cleaned_data['number_of_guests'] 
     guest.comment = self.cleaned_data['comment'] 
     guest.save() 
     return guest 

問題在於保存方法。我如何將訪客與當前登錄的用戶相關聯?

guest = self.Guest.objects.get(user=1) 

而不是user=1我需要有當前登錄的用戶的ID。

謝謝!

回答

37

我找到了方法:)

  1. 寫在表格上一個__init__方法:

    def __init__(self, user, *args, **kwargs): 
        self.user = user 
        super(RSVPForm, self).__init__(*args, **kwargs) 
    
  2. 更改視圖功能,並通過request.user的形式

    def event_view(request, slug, model_class=Event, form_class=RSVPForm, 
               template_name='rsvp/event_view.html'): 
        event = get_object_or_404(model_class, slug=slug) 
    
        if request.POST: 
         form = form_class(request.user, request.POST) 
    
        if form.is_valid(): 
         guest = form.save() 
         return HttpResponseRedirect(reverse('rsvp_event_thanks', 
            kwargs={'slug': slug, 'guest_id': guest.id})) 
        else: 
         form = form_class(request.user) 
    
        return render_to_response(template_name, { 
         'event': event, 
         'form': form, 
        }, context_instance=RequestContext(request)) 
    
  3. save()方法的行現在看起來像這樣:

    guest = self.guest_class.objects.get(user=self.user) 
    
+5

照顧,你打破了里氏替換原則:https://en.wikipedia.org/wiki/Liskov_substitution_principle。看看這個答案添加用戶參數沒有打破利斯科夫原則:http://stackoverflow.com/a/7300076/801924 – bux 2016-05-19 12:16:43