2011-02-25 18 views
26

Duplicar posibles:
get request data in Django formobtener usuario actual en el formulario de Django

Hay una parte de mi modelo de visitantes:

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

formulario para obtener la respuesta de los invitados:

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 

El problema está en el método guardar. ¿Cómo puedo asociar invitado con el usuario actualmente conectado?

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

En lugar de user=1 Necesito tener id del usuario actualmente conectado.

Gracias!

Respuesta

37

He encontrado el camino :)

  1. escribir un método __init__ en el formulario:

    def __init__(self, user, *args, **kwargs): 
        self.user = user 
        super(RSVPForm, self).__init__(*args, **kwargs) 
    
  2. Cambio función de vista, y pasan a la forma 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. la línea del método save() se vería así ahora:

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

Tenga cuidado, que se rompió Liskov principio de sustitución: https://en.wikipedia.org/wiki/Liskov_substitution_principle. Mire esta respuesta para agregar el parámetro de usuario sin romper el principio de liskov: http://stackoverflow.com/a/7300076/801924 – bux

Cuestiones relacionadas