【发布时间】:2020-03-27 07:13:33
【问题描述】:
我有一个 ChallengeDetailView,它显示挑战的详细信息,例如博客文章。我在同一页面上还有一个表单字段,它应该得到挑战的答案,并将其与数据库进行比较。到目前为止,这是我所做的;
class ChallengeDetailView(DetailView):
model = Challenge
def get_context_data(self, **kwargs):
context = super(ChallengeDetailView, self).get_context_data(**kwargs)
context['form'] = FlagForm
return context
from django import forms
class FlagForm(forms.Form):
flag = forms.CharField(label='Challenge Flag',required=True)
class FlagFormView(FormView):
form_class = FlagForm
success_url = reverse_lazy('challenge-detail')
我尝试实现如下的简单逻辑;
def get_flag(self, request):
if self.request.method == 'POST':
form = FlagForm(request.POST)
if form.is_valid():
flag = form.cleaned_data.get('flag')
if flag == Challenge.flag:
return messages.success("You found the flag!")
else:
return FlagForm()
我试图将其包含在 form_valid() 方法中,但无法使其在 ChallengeDetailView 中工作。我愿意接受任何建议。我来自 Symfony 背景,对 Django 很陌生。
【问题讨论】:
-
你能添加你的
FlagForm类吗? -
对不起,我错过了。更新了问题。谢谢你的提醒。 @JPG
-
首先,你可以在这里使用Django's
ModelFormclass,它更适合机型。因此,我建议用 ModelForm 重写FlagForm并在 Form 类本身中编写适当的 validation functions。 -
按照您提供的文档进行操作,但现在当我发送表单时出现 405 错误。我认为这是因为细节视图中不允许使用 POST 方法。是否有正确的方法可以在 detailview 上启用 POST 方法,或者它违反了良好做法? @JPG
-
是的..你是对的。您需要将
UpdateView与 DetailView 一起使用。
标签: django django-forms django-views django-database