Проблема в создании идеальной пользовательской проверки django - PullRequest
0 голосов
/ 27 октября 2018

У меня есть эта модель для моего бухгалтерского приложения:

class Simpleunits(models.Model):
    User       = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    symbol     = models.CharField(max_length=32)
    formal     = models.CharField(max_length=32)

class Compoundunits(models.Model):
    User       = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    firstunit  = models.ForeignKey(Simpleunits,on_delete=models.CASCADE)
    conversion = models.DecimalField(max_digits=19,decimal_places=2)
    secondunit = models.ForeignKey(Simpleunits,on_delete=models.CASCADE)

class Stockdata(models.Model):
    User        = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    stock_name  = models.CharField(max_length=32)
    unitsimple  = models.ForeignKey(Simpleunits,on_delete=models.CASCADE,null=True,blank=True)
    unitcomplex = models.ForeignKey(Compoundunits,on_delete=models.CASCADE,null=True,blank=True)

Я хочу создать пользовательский метод проверки в классе модели Stockdata, который, если пользователь упомянет и unitsimple, и unitcomplex, получит ошибку проверки: «Нужно указать только одну единицу» и наоборот ...

Я имею в виду, что пользователь может упомянуть только одну единицу: unitsimple или unitcomplex, если они упоминают обе, тогда они получат ошибку проверки ...

У кого-нибудь есть идеи, что мне делать в функции def clean (self) для достижения этой цели? ???

Заранее спасибо ...

1 Ответ

0 голосов
/ 27 октября 2018

Создайте форму модели для представления представления Stockdata и, как вы сказали, добавьте пользовательский метод clean (), как показано ниже.

class CreateStockData(forms.ModelForm):
   class Meta:
       model = Stockdata        
       fields= [....]
   ....
   def clean(self):
       cleaned_data = super(CreateStockData, self).clean()
       unitsimple = cleaned_data.get('unitsimple')
       unitcomplex = cleaned_data.get('unitcomplex')
       if unitsimple != None and unitcomplex != None:
           raise forms.ValidationError({'unitcomplex':["You are not supposed to select both values!"]})

Редактировать

С учетом вашего комментария позвольте мне опубликовать другой способ.

class Stockdata(models.Model):
    ....
    def clean(self):
        if self.unitsimple is not None and if self.unitcomplex is not None:
            raise ValidationError(
                {'unitcomplex':["You are not supposed to select both values!"]})
    def save(self, *args, **kwargs):
        self.full_clean()
        super().save(*args, **kwargs)

См. Проверка объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...