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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:35:28