2011-02-25 142 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