【问题标题】:BaseInlineFormSet clean method in admin false trigger?管理员错误触发器中的 BaseInlineFormSet 清理方法?
【发布时间】:2016-07-13 17:20:14
【问题描述】:

我正在尝试更新 Admin 中的一个字段,但它会从我在 forms.py 中定义如下的 clean 方法引发验证错误:

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,

)

此代码在视图中有效,但在管理员中,我无法更新或添加任何电话号码,因为它会为重复条目引发相同的 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,
    ]

我在 models.forms 中查看了BaseInlineFormSet,但我更加困惑。

【问题讨论】:

    标签: django inline-formset


    【解决方案1】:
    class PhoneInline(admin.StackedInline):
        model = Phone
        formset = BasePhoneFormSet
        fields = ('number',)
        can_delete = False
        extra = 0
        min_num = 1
    

    【讨论】:

    • 虽然此代码可能有助于解决问题,但提供有关它为什么和/或如何回答问题的额外上下文将显着提高其长期价值。请编辑您的答案以添加一些解释。
    • 我很想看到更多解释为什么我的初始代码不起作用。此外,BasePhoneFormSetPhoneFormSetPhoneInline 下都作为formset 工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2014-01-29
    • 2015-02-07
    • 2020-10-23
    • 2014-02-18
    相关资源
    最近更新 更多