You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:24:06