django - 如何将django表单指向pk?
问题描述
我正在尝试制作一个由 DetailView 对象动态选择的表单。
我想单击 DetailView 链接并转到其主键与我的详细视图中的主键相同的表单。当我尝试这样做时,我得到一个错误。我怎样才能做到这一点?他们是一个可以帮助我的预建库吗?
我的模型:
'''
class MemberStudent(models.Model):
instructor = models.ForeignKey(Teachers, on_delete=models.CASCADE)
name = models.CharField(max_length=50, default="Doe")
age = models.IntegerField(default=99)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('student_detail', args=[str(self.id)])
class BehaviorGrade(models.Model):
SEVERITY = [
('Bad','Bad Behavior'),
('Good','Good Behavior'),
('Danger','Dangerous'),
]
LETTER_GRADE = [
('A','A'),
('B','B'),
('F','F'),
]
studentName = models.ForeignKey(MemberStudent, on_delete=models.CASCADE) #need a link to student name
eventGrade = models.CharField(max_length=1, choices=LETTER_GRADE)
eventSeverity = models.CharField(max_length=15, choices=SEVERITY)
eventTitle = models.CharField(max_length=15)
eventDescription = models.TextField()
def __str__(self):
return self.eventTitle
'''
我的观点:
'''
class StudentDetailView(FormMixin,DetailView):
model = MemberStudent
template_name = 'student_detail.html'
form_class = BehaviorForm
def get_success_url(self):
return reverse('student_detail', kwargs={'pk':self.object.pk})
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
form.save()
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
return super().form_valid(form)
'''
我的forms.py:'''
class BehaviorForm(ModelForm):
class Meta:
model = BehaviorGrade
fields = ['eventGrade',
'eventSeverity','eventTitle',
'eventDescription']
'''
我的网址:
'''
path('students/<int:pk>', StudentDetailView.as_view(), name='student_detail'),
'''
我的 html 模板(它是在同一页面上带有以下表单的详细视图):'''
{{ object.id }}
{{ object.name }}
{{ object.age }}
{{ object.instructor }}
<form action="{% url 'student_detail' object.id %}" method="POST">
{{ form }}
{% csrf_token %}
<input type="submit" value="REVIEW">
</form>
'''
提交表单时的错误消息:
“/student/students/1 处的 IntegrityError
NOT NULL 约束失败:Student_behaviorgrade.studentName_id"
发送的表格也没有我在表格代码中要求的 PK。
django 错误日志显示 PK 从未发送这里是关于虚拟数据测试的日志消息:
参数 [无,'A','坏','asdf','asdf']
解决方案
那是因为您必须在行为前卫上手动设置成员学生 ID。
post
您可以在视图的功能中这样做:
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
behavior_grade = form.save(commit=False)
behavior_grade.studentName = self.object
return self.form_valid(form)
else:
return self.form_invalid(form)
你也可以看看这个方法来使用form_valid
函数来做到这一点:
## Include the instance object before saving def form_valid(self, form): form.instance.studentName = self.object return super().form_valid(form)
推荐阅读
- java - 为特定 groupId 生成依赖关系图
- dask - dask 无法识别我的服务模块
- java - 如何为可选的 int 变量赋值?
- c++ - 避免对 Pi 的第 N 位进行四舍五入
- android - 在类 android 错误中找不到 setter/getter
- python-3.x - 使用 pandas 来展平字典
- c - 将 N 行输入到 C 中的指针数组中:K&R 示例
- dependencies - TYPO3 Crawler 和 TYPO3 10.2 的依赖关系
- tensorflow - keras/Tensorflow中层的用途是什么
- python - 在 QTableWidget 工作中对数字进行排序不正确 Pyqt5