基于特定情况的Django ModelForm验证



我有一个表单:

class AdForm(ModelForm):
    class Meta:
        model = Ad
        widgets = {
            'title': TextInput(attrs={'class': 'small'}),
            'link': TextInput(attrs={'class': 'large'}),
            'code': Textarea(attrs={'class': 'limit', 'cols': 60, 'rows': 20}),
            'clicks': TextInput(attrs={'class': 'tiny', 'value': 0}),
        }

基于:

TYPE_CHOICES = (
    ('Image', 'Image'),
    ('Code', 'Code'),
)
SIZE_CHOICES = (
    ('Leaderboard', 'Leaderboard'),
    ('Banner', 'Banner'),
    ('Skyscraper', 'Skyscraper'),
    ('Square', 'Square'),
)
class Ad(models.Model):
    title = models.CharField(max_length=40)
    type = models.CharField(max_length=5, choices=TYPE_CHOICES)
    size = models.CharField(max_length=11, choices=SIZE_CHOICES)
    link = models.URLField(null=True)
    media = models.ImageField(null=True, upload_to='ads')
    code = models.TextField(null=True, max_length=500)
    clicks = models.IntegerField()
    created = models.DateTimeField(auto_now_add=True)
    expires = models.DateTimeField(null=True)
    def __unicode__(self):
        return self.name

,基本上,如果类型是图像,我想链接和媒体需要,但如果它是代码,我想代码需要。是否有办法做到这一点或基于某些条件强制验证这些字段?

我目前的处理方法如下:

@login_required
def create(request):
    if request.POST:
        form = AdForm(request.POST)
        if form.is_valid():
            status = 'Success'
        else:
            status = 'Failure'
    else:
        form = AdForm()
        status = 'None'
    template = loader.get_template('ads/create.html')
    context = RequestContext(request, {
        'form': form,
        'status': status
    })
    return HttpResponse(template.render(context))

我看了文档,但它说强制保存,有没有其他更好的方法?作为一个Django新手,非常感谢你。

查看有关验证依赖于其他字段的字段的表单的文档:https://docs.djangoproject.com/en/1.11/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

您的模型需要允许字段为空,这样当某些组合无效时,您就不会从模型中获得所需的验证错误。相反,请确保在表单级别存在字段值的正确组合。

最新更新