我是 Django 新手。
我有一个看起来像这样的模型:
模型.py
class Intervention(models.Model):
subject = models.CharField(max_length=200)
begin_date = models.DateField(default=datetime.datetime.today)
end_date = models.DateField(default=datetime.datetime.today)
description = models.TextField(blank=True)
speaker = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
campus = models.ForeignKey(Campus, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Intervention'
verbose_name_plural = 'Interventions'
def __str__(self):
return self.subject
class Evaluation(models.Model):
interventions = models.ForeignKey(Intervention, on_delete=models.CASCADE)
student_id = models.CharField(max_length=20)
speaker_knowledge_mark = models.IntegerField(validators=[MaxValueValidator(20), MinValueValidator(0)])
speaker_teaching_mark = models.IntegerField(validators=[MaxValueValidator(20), MinValueValidator(0)])
speaker_answer_mark = models.IntegerField(validators=[MaxValueValidator(20), MinValueValidator(0)])
slide_content_mark = models.IntegerField(validators=[MaxValueValidator(20), MinValueValidator(0)])
slide_examples_mark = models.IntegerField(validators=[MaxValueValidator(20), MinValueValidator(0)])
comment = models.TextField(blank=True)
Run Code Online (Sandbox Code Playgroud)
这个想法是,当学生在主页上进入网站时,他必须选择他学习的校园,然后他被重定向到一个页面,在该页面中他只能看到其校园的干预措施,然后当他选择干预措施时,他会得到它的详细信息:
到目前为止一切正常。现在,在“干预详细信息页面”上,当用户单击“给予标记”时,他将被重定向到创建标记的页面(我使用基于 CreateView 类的),如下所示:
现在我的问题是如何用学生想要评分的干预的 pk 替换生成的表单中的 Modelchoicefield?
视图.py
class CreateEvaluationView(CreateView):
form_class = NewEvaluation
template_name = 'mark.html'
def home(request):
campus = Campus.objects.all().order_by('-name')
return render(request, 'home.html', {'campus': campus})
def mark(request):
if request.method == 'POST':
campus = request.POST.get('campus')
intervention = Intervention.objects.filter(campus=campus)
return render(request, 'mark.html', {'intervention': intervention})
def intervention_detail(request, pk):
intervention_detail = get_object_or_404(Intervention, pk=pk)
return render(request, 'intervention_detail.html', {'intervention_detail': intervention_detail})
Run Code Online (Sandbox Code Playgroud)
urls.py
path('', views.home, name='home'),
path('mark/', views.mark, name='mark'),
path('mark/<int:pk>/', views.intervention_detail, name='intervention_detail'),
path('mark/create/', CreateEvaluationView.as_view(template_name="givemark.html"), name='newmark'),
path('intervention/create/', login_required(CreateInterventionView.as_view(template_name="intervention_create.html")), name='create'),
path('intervention/', login_required(ListInterventionView.as_view(template_name="intervention_list.html")), name='list'),
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!致以诚挚的问候。
您需要向您的表单提供Interventionpk。最简单的解决方案是将其与 url 一起传递:
path('mark/create/<int:intervention_pk>', CreateEvaluationView.as_view(template_name="givemark.html"), name='newmark'),
Run Code Online (Sandbox Code Playgroud)
需要修改您的模板才能通过干预 pk,例如reverse('newmark', intervention_pk=intervention.pk)
从表单中排除干预 pk,这样您的用户将无法意外修改它。
class NewEvaluation(forms.ModelForm):
class Meta:
model = Evaluation
exclude = ('interventions',)
Run Code Online (Sandbox Code Playgroud)
在保存表单之前设置干预 pk:
class CreateEvaluationView(CreateView):
form_class = NewEvaluation
template_name = 'mark.html'
def form_valid(self, form):
intervention = Intervention.objects.get(pk=self.kwargs['intervention_pk'])
self.object = form.save(commit=False)
self.object.interventions = intervention
self.object.save()
Run Code Online (Sandbox Code Playgroud)