簡體   English   中英

如何在 DetailView 中根據數據庫驗證和比較數據 - Django

[英]How to Validate and Compare Data against the Database in DetailView - Django

我有一個 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 非常陌生。

最后我能夠弄清楚。 我在 forms.py 中創建了一個常規表單

from django import forms

class FlagForm(forms.Form):
    flag = forms.CharField()

在 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

使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM