0

I read Django - Access request.session in form but am still almightly confused.

I want the default value in one of my form fields to be from self.requests.session (I also tried requests.session).

class BookARoomForm(forms.ModelForm):
    def __init__(self, request, *args, **kwargs):
        super(BookARoomForm, self).__init__(*args, **kwargs)
        self.fields['arrival_date'].initial = self.requests.session['arrival_date']
        
    class Meta:
        model = RoomBooking
        fields = ('User', 'title', 'room_type', 'arrival_date', 'departure_date', 'cost')
      

In get_context_data I have tried context['book_a_room_form'] = BookARoomForm(), context['book_a_room_form'] = BookARoomForm(request) and context['book_a_room_form'] = BookARoomForm(self.request). Each time I got a different error.

class HotelDetailSlugView(ObjectViewedMixin, DetailView):
       template_name = "hotel/detail.html"


def get_context_data(self, *args, **kwargs):
    context = super(HotelDetailSlugView, self).get_context_data(*args, **kwargs)
    context['book_a_room_form'] = BookARoomForm()  # Your part form


    
Ross Symonds
  • 690
  • 1
  • 8
  • 29

1 Answers1

0

To add a default value to a form in a Django Class Based View, instantiate the form in the get method instead of get_context_data like this :

class HotelDetailSlugView(ObjectViewedMixin, DetailView):
   template_name = "hotel/detail.html"

   def get(self, request, *args, **kwargs):
       # This code is executed each time a GET request is coming on this view
       # It's is the best place where a form can be instantiate

       form  = BookARoomForm(initial={'arrival_date': request.session['arrival_date']})
       return render(request, self.template_name, {'form': form})

NOTE ALSO : in your __init__ method of BookARomForm, you make a typo ; normally the line must be self.fields['arrival_date'].initial = request.session['arrival_date']. It is request.session not requests.session (ending s on request must not be there)

Rvector
  • 2,312
  • 1
  • 8
  • 17