如何在Django的forms.ModelForm中使用request.session设置字段默认值
问题修复方案
你的报错主要是四处写法错误导致的:表单__init__参数未绑定到实例、单词拼写错误、视图方法缩进错误、实例化表单未传对应参数。
1. 修正后的ModelForm代码
class BookARoomForm(forms.ModelForm): def __init__(self, request, *args, **kwargs): # 先将传入的request绑定到表单实例,注意拼写是request不是requests self.request = request super(BookARoomForm, self).__init__(*args, **kwargs) # 用get方法取值避免session无对应键时抛出KeyError,第二个参数可自定义默认值 self.fields['arrival_date'].initial = self.request.session.get('arrival_date', None) # 可额外补充:User字段默认设为当前登录用户,无需用户手动选择 if self.request.user.is_authenticated: self.fields['User'].initial = self.request.user class Meta: model = RoomBooking fields = ('User', 'title', 'room_type', 'arrival_date', 'departure_date', 'cost')
2. 修正后的视图代码
class HotelDetailSlugView(ObjectViewedMixin, DetailView): template_name = "hotel/detail.html" # 注意缩进:get_context_data是类的实例方法,必须缩进在类内部 def get_context_data(self, *args, **kwargs): context = super(HotelDetailSlugView, self).get_context_data(*args, **kwargs) # 实例化表单时传入当前视图的request对象 context['book_a_room_form'] = BookARoomForm(self.request) return context
补充注意事项
后续处理表单提交的POST逻辑里,实例化表单时也需要传入request参数,写法为:form = BookARoomForm(self.request, data=self.request.POST)
内容的提问来源于stack exchange,提问作者Ross Symonds
相关产品推荐
相关产品推荐

