2016-07-13 3 views
1

Я пытаюсь обновить поле в администратора, но это повышает Ошибка проверки от чистого метода, который я определил следующим образом в forms.py:BaseInlineFormSet метод очистки в admin false trigger?

class BasePhoneFormSet(BaseInlineFormSet): 

    def clean(self): 
     super(BasePhoneFormSet, self).clean() 
     if any(self.errors): 
      return 

     phone_numbers = [] 
     for form in self.forms: 
      if form.cleaned_data.get('number') in phone_numbers: 
       raise forms.ValidationError(
        'Duplicate Entry') 
      phone_numbers.append(form.cleaned_data.get('number')) 



PhoneFormSet = inlineformset_factory(
    Post, 
    Phone, 
    formset=BasePhoneFormSet, 
    form=PostForm, 
    fields = ('number',), 
    can_delete=False, # admin still shows delete next to the phone number 
    extra=0, 
    validate_min=True, 
    min_num=1, 

) 

Этот код работает в представлениях, но в админке, я могу» t обновить или добавить любой номер телефона, так как он повышает то же значение ValidationError для дублирования записи.

вот мой models.py

class Post(TimeStampedModel, models.Model): 
    unique_id = models.CharField(max_length=6, unique=True) 
    user = models.ForeignKey(User, related_name='posts') 
    city = models.ForeignKey(City, related_name='posts') 

class Phone(TimeStampedModel, models.Model): 
    number = models.CharField(
     validators=[phone_regex], max_length=15) 
    post = models.ForeignKey(Post) 

И это admin.py

class PhoneInline(admin.StackedInline): 
    model = Phone 
    formset = PhoneFormSet 

class PostAdmin(admin.ModelAdmin): 
    inlines = [ 
     PhoneInline, 
    ] 

Я посмотрел в BaseInlineFormSet в models.forms, но я запуталась больше.

ответ

1
class PhoneInline(admin.StackedInline): 
    model = Phone 
    formset = BasePhoneFormSet 
    fields = ('number',) 
    can_delete = False 
    extra = 0 
    min_num = 1 
+1

Хотя этот код может помочь решить проблему, предоставив дополнительный контекст относительно того, почему и/или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Измените свой ответ, чтобы добавить какое-то объяснение. –

+0

Мне бы хотелось увидеть больше объяснений, почему это сработало, пока мой первоначальный код этого не сделал. также, как «BasePhoneFormSet», так и «PhoneFormSet» работали как 'formet' под' PhoneInline' – static