首页 > 解决方案 > 如何将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']

标签: djangodjango-forms

解决方案


那是因为您必须在行为前卫上手动设置成员学生 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)

推荐阅读