[英]How to Validate and Compare Data against the Database in DetailView - Django
I have a ChallengeDetailView which shows the details of a challenge like a blog post.我有一个 ChallengeDetailView,它显示了像博客文章一样的挑战的详细信息。 I also have a form field on the same page and it supposed to get an answer of a challenge, and compare it to the database.我在同一页面上还有一个表单字段,它应该得到一个挑战的答案,并将其与数据库进行比较。 So far here is what I did;到目前为止,这是我所做的;
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')
I try to implement a simple logic like the following;我尝试实现一个简单的逻辑,如下所示;
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()
I tried to include this in form_valid() method but couldn't make it work in the ChallengeDetailView.我试图将其包含在 form_valid() 方法中,但无法使其在 ChallengeDetailView 中工作。 I'm open to any kind of suggestions.我愿意接受任何建议。 I'm coming from a Symfony background and pretty new to Django.我来自 Symfony 背景并且对 Django 非常陌生。
Finally I was able to figure it out.最后我能够弄清楚。 I created a regular form in forms.py我在 forms.py 中创建了一个常规表单
from django import forms
class FlagForm(forms.Form):
flag = forms.CharField()
In views.py I have a detail view and form view with SingleObjectMixin to work on the current post.在 views.py 中,我有一个使用 SingleObjectMixin 的详细视图和表单视图来处理当前帖子。
class ChallengeDisplay(DetailView):
model = Challenge
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = FlagForm()
return context
Form view with SingleObjectMixin;使用 SingleObjectMixin 形成视图;
class ChallengeFormEntry(SingleObjectMixin, FormView):
template_name = 'ctf/challenge_detail.html'
form_class = FlagForm
model = Challenge
def post(self, request, *args, **kwargs):
if request.method == 'POST':
form = FlagForm(request.POST)
if form.is_valid():
flag = form.cleaned_data.get('flag')
if self.get_object().flag == flag:
messages.success(request, 'good job!')
else: messages.warning(request, 'Try again!')
form = FlagForm()
return super().post(request, *args, **kwargs)
def get_success_url(self):
return reverse('challenge-detail', kwargs={'pk': self.get_object().pk, 'slug':self.get_object().slug})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.