从ModelForm的验证中自定义



我是Django的新手,我开始写我的第一个web应用程序。https://ibb.co/jDPwSHG我想使自定义验证,例如赢家不能也输了。我如何使用ModelForm做到这一点?谁能给我举个例子?

我model.py

from django.db import models
# Create your models here.
from datetime import datetime
from django.db import models
# Create your models here.
players = (
('Mateuszex', 'Mateuszex'),
('Piwkief', 'Piwkief'),
('Młody', 'Młody'),
('Prezes', 'Prezes'),
('Bogusław', 'Bogusław'),
)
winner = ((0, 'Gracz1'), (1, 'Gracz2'))
number_of_sets = ((0, 0), (1, 1), (2, 2), (3, 3))

class MatchScore(models.Model):
winner = models.CharField(max_length=15, choices=players, blank=False)
lost = models.CharField(max_length=15, choices=players, blank=False)
winner_sets = models.PositiveSmallIntegerField(choices=number_of_sets, blank=False)
lost_sets = models.PositiveSmallIntegerField(choices=number_of_sets, blank=False)
duel_date = models.DateTimeField(null=True, blank=False, default=datetime.now)
def __str__(self):
return self.winner + ' ' + str(self.winner_sets) + ' - ' + str(self.lost_sets) + ' ' +  self.lost

我froms.py

from django.forms import ModelForm
from .models import MatchScore, Table

class MatchScoreForm(ModelForm):
# winner = MatchScore(help_text='Use puns liberally')
class Meta:
model = MatchScore
fields = ['winner', 'winner_sets', 'lost_sets', 'lost', 'duel_date']

我view.py

from django.shortcuts import render, get_object_or_404, redirect
from .forms import MatchScoreForm
from .models import MatchScore, Table
from django.contrib import messages

# Create your views here.
def all_scores(request):
match = MatchScore.objects.order_by('-duel_date')
return render(request, 'pingpong.html', {'form': match})
def new_score(request):
form = MatchScoreForm(request.POST or None)
if form.is_valid():
form.save()
return redirect(all_scores)
return render(request, 'match_form.html', {'form': form})

要向表单添加验证,需要实现各种方法。例如,为了验证某些字段,您需要实现clean_<field>方法,其中<field>是字段的名称。如果你需要一些验证,你需要访问多个字段,你需要覆盖clean方法:

from django.core.exceptions import ValidationError
class MatchScoreForm(ModelForm):
# winner = MatchScore(help_text='Use puns liberally')
class Meta:
model = MatchScore
fields = ['winner', 'winner_sets', 'lost_sets', 'lost', 'duel_date']

def clean(self):
cleaned_data = super().clean()
if cleaned_data.get('winner') == cleaned_data.get('lost'):
raise ValidationError("The Winner and Loser cannot be the same.")
return cleaned_data

参考:清理和验证相互依赖的字段

最新更新