Требовать поле модели на сайте администратора, только если другое поле модели имеет значение true - PullRequest
2 голосов
/ 01 апреля 2012

В одной из моих моделей я хочу, чтобы объект внешнего ключа требовался, только если другое поле логической модели имеет значение true. Как мне настроить админский сайт так себя вести?

Мой models.py содержит:

from django.db import models

class ThingOne(models.Model):
    name = models.CharField(max_length=100)

class ThingTwo(models.Model):
    name = models.CharField(max_length=100)
    use_thingone = models.BooleanField()
    thingone = models.ForeignKey(ThingOne, blank=True, null=True)

А мой admin.py содержит:

from myapp.models import ThingOne
from myapp.models import ThingTwo
from django.contrib import admin

admin.site.register(ThingOne)
admin.site.register(ThingTwo)

Как мне настроить это, чтобы thingone было обязательным полем внешнего ключа, только если use_thingone истинно?

Ответы [ 2 ]

5 голосов
/ 01 апреля 2012

Вам на самом деле нужно только переопределить метод clean вашей модели:

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from django.db import models

class ThingTwo(models.Model):
    #Your stuff

    def clean(self):
        """
        Validate custom constraints
        """
        if self.use_thingone and self.thingone is None:
            raise ValidationError(_(u"Thing One is to be used, but it not set!"))
1 голос
/ 01 апреля 2012

Создайте форму для ThingTwo и проверьте, что вам нужно, в методе модели clean ().

Здесь создается форма для модели - https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelform и используется настраиваемая форма для администратора модели - https://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

...