使用Django通用视图创建Station时遇IntegrityError问题求助
使用Django通用视图创建Station时的问题
- 移除
user外键后,触发错误:IntegrityError at /station/Add/
(1048, "Column 'user_type_id' cannot be null") - 不设置
user_type时,点击提交按钮后表单自动刷新且内容清空
相关代码
station/views.py
class StationCreateView(LoginRequiredMixin, CreateView): model = Station fields = ('station_name', 'station_address','connectors','status', 'start_time','end_time','open_day', 'state', 'city', 'area', 'user') template_name = 'owner/add_station.html' def form_valid(self, form): form.instance.user = self.request.user return super().form_valid(form)
station/models.py
class Station(models.Model): STAUTUS_CHOICE = ( ("ACTIVE", "ACTIVE"), ("INACTIVE", "INACTIVE") ) DAY_CHOICE = ( ("MONDAY", "MONDAY"), ("Tuesday", "TUESDAY"), ("WEDNESDAY", "WEDNESDAY"), ("THURSDAY", "THURSDAY"), ("FRIDAY", "FRIDAY"), ("SATURDAY", "SATURDAY"), ("SUNDAY", "SUNDAY"), ("ALL DAY", "ALL DAY") ) station_id = models.AutoField(primary_key=True) state = models.ForeignKey(State, on_delete=models.CASCADE) city = models.ForeignKey(City, on_delete=models.CASCADE) area = models.ForeignKey(Area, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE) station_name = models.CharField(max_length=50) station_address = models.CharField(max_length=255) connectors = models.CharField(max_length=50) status = models.CharField(max_length=20, choices=STAUTUS_CHOICE, default="ACTIVE") start_time = models.TimeField(null=True) end_time = models.TimeField(null=True) open_day = models.CharField(max_length=20, choices=DAY_CHOICE, default="ALL DAY") # give_feedback = models.CharField(max_length=255, null=True) deleted = models.IntegerField(default=0, unique=False)
add_station.html
<form method="post" action="" novalidate> {% csrf_token %} <div class="form-row"> <div class="form-group col-md-12 mb-0"> {{ form.station_name|as_crispy_field }} </div> <div class="form-group col-md-12 mb-0"> {{ form.station_address|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.connectors|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.status|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.start_time|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.end_time|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.open_day|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.state|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.city|as_crispy_field }} </div> <div class="form-group col-md-6 mb-0"> {{ form.area|as_crispy_field }} </div> <button type="submit" class="w-full rounded-full bg-red-gradient p-3 text-white font-bold hover:ring">Add Station</button> </div> </form>
问题解决
1. 处理user_type_id cannot be null错误
这个错误和Station模型的user外键无关,是当前登录的User实例本身缺少必填的user_type字段值导致的:
- 检查
User模型的user_type字段,若不需要强制关联,添加null=True, blank=True参数 - 确保当前登录用户已经在后台设置了对应的
user_type值
2. 解决表单提交后清空刷新的问题
这是表单验证失败但未显示错误提示导致的,按以下步骤修改:
- 从视图的
fields中移除user字段,因为已经在form_valid中自动绑定当前用户,无需在表单中展示 - 在模板表单顶部添加错误提示代码,以便看到验证失败原因:
{% if form.errors %} <div class="alert alert-danger"> {% for field in form %} {% for error in field.errors %} <p>{{ field.label }}: {{ error }}</p> {% endfor %} {% endfor %} {% for error in form.non_field_errors %} <p>{{ error }}</p> {% endfor %} </div> {% endif %} - 检查
state、city、area外键字段是否有可用数据,提交表单时必须选择有效值
修改后的视图代码:
class StationCreateView(LoginRequiredMixin, CreateView): model = Station fields = ('station_name', 'station_address','connectors','status', 'start_time','end_time','open_day', 'state', 'city', 'area') template_name = 'owner/add_station.html' def form_valid(self, form): form.instance.user = self.request.user return super().form_valid(form)
内容的提问来源于stack exchange,提问作者Kukadiya Keval
相关产品推荐
相关产品推荐

