Изменение свойства 'required' поля формы с помощью save_model в Django admin - PullRequest
0 голосов
/ 21 ноября 2018

Я перепробовал все различные примеры и методы, которые я мог найти для переполнения стека, и по какой-то причине не могу заставить это работать должным образом.

Так что в моем admin.py у меня естьUserForm и и UserAdmin.Основываясь на условии, что в форме проверяется логическое значение, я хочу изменить атрибут 'required' в нескольких различных полях формы на 'false', чтобы я мог эффективно сохранить.Я использовал несколько различных операторов печати, чтобы удостовериться, что «требуемый» фактически изменяется на «ложь» при выполнении условия, однако, когда я пытаюсь и сохраняюсь, он не позволяет мне, поскольку поля выделяются и говорят, что онивсе еще требуются.

Это похоже на то, что save_model не заботится о том, как я редактирую форму, что старая форма и ее «обязательные» атрибуты переопределяют мои изменения.Спасибо за любую помощь!

admin.py

class UserForm(forms.ModelForm):
    state = forms.CharField(min_length=2, widget=forms.TextInput(attrs={'placeholder':'CA'}))
    zipcode = forms.CharField(max_length=5, min_length=5,)

    class Meta:
        model = User
        fields = '__all__'


class UserAdmin(admin.ModelAdmin):
    model = Order
    form = UserForm

    def save_model(self, request, obj, form, change):
        if obj.pickup_only == 1:
            form.fields['address'].required = False
            form.fields['city'].required = False
            form.fields['state'].required = False
            form.fields['zipcode'].required = False
        return super(UserAdmin, self).save_model(request, obj, form, change)

исправлен код для пользовательской формы:

def clean(self):
    cleaned_data = super(UserForm, self).clean()
    address = cleaned_data.get('address')
    state = cleaned_data.get('state')
    city = cleaned_data.get('city')
    zipcode = cleaned_data.get('zipcode')
    pickup_only = cleaned_data.get('pickup_only')

    if pickup_only == True:
        # I STUCK IN ADDRESS TO EMPHASIZE THE ERROR IN SCREENSHOT
        self.fields_required(['first_name', 'last_name', 'dob', 'phone', 'email', 'address'])
    else:
        self.cleaned_data['address', 'city', 'state', 'zip code'] = ''
    return self.cleaned_data

def fields_required(self, fields):
    for field in fields:
        print(field)
        # RETURNS: first_name, last_name, dob, phone, email, address
        if not self.cleaned_data.get(field, ''):
            msg = forms.ValidationError("This field is required. Custom.")
            self.add_error(field, msg)

При сохранении яполучите это:

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2018

Возможно, вам придется немного подстроить его под свои нужды, но вы можете попробовать что-то вроде этого в вашем чистом методе:

def clean(self):
    cleaned_data = super(UserForm, self).clean()
    state = cleaned_data.get('state')
    zipcode = cleaned_data.get('zipcode')
    pickup_only = cleaned_data.get('pickup_only')

    if pickup_only == True:
        self.fields_required(['any_fields_required',])
    else:
        self.cleaned_data['state', 'zip code'] = ''
    return self.cleaned_data

def fields_required(self, fields):
    for field in fields:
        if not self.cleaned_data.get(field, ''):
            msg = forms.ValidationError("This field is required.")
            self.add_error(field, msg)

Кроме того, как упомянул один из комментаторов, вы не должныукажите вашу модель = Заказ в UserAdmin.Ваш UserAdmin предназначен для модели User.Это не правильный способ добавления строк.См. Ниже:

# You can also use (admin.TabularInline) depending on your needs.
class OrderInline(admin.StackedInline):
    model = Order
    list_display = ('order_fields',)
    fieldsets = (
        ((''), {'fields': ('order_fields',)}),
    )

class UserAdmin(admin.ModelAdmin):
    model = User
    inlines = [OrderInline,]

Добавьте метод init к своей форме:

class UserForm(forms.ModelForm):
    state = forms.CharField(min_length=2, widget=forms.TextInput(attrs={'placeholder':'CA'}))
    zipcode = forms.CharField(max_length=5, min_length=5,)

    class Meta:
        model = User
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)
        self.fields['address'].required = False
        self.fields['city'].required = False
        self.fields['state'].required = False
        self.fields['zipcode'].required = False

    def clean(self):
        cleaned_data = super(UserForm, self).clean()
        address = cleaned_data.get('address')
        state = cleaned_data.get('state')
        city = cleaned_data.get('city')
        zipcode = cleaned_data.get('zipcode')
        pickup_only = cleaned_data.get('pickup_only')

        if pickup_only == True:
            self.fields_required(['first_name', 'last_name', 'dob', 'phone', 'email', 'address'])
        else:
            self.cleaned_data['address', 'city', 'state', 'zip code'] = ''
        return self.cleaned_data

    def fields_required(self, fields):
        for field in fields:
            if not self.cleaned_data.get(field, ''):
                msg = forms.ValidationError("This field is required. Custom.")
                self.add_error(field, msg)

Попробуйте это.Если это работает, то я не думаю, что вы должны переопределить метод сохранения в вашем UserAdmin.Во всяком случае, я бы избегал этого, если бы это не было абсолютно необходимо.

...