Django admin - Всплывающее окно + внешнего ключа отсутствует при переопределении поля формы администратора - PullRequest
1 голос
/ 18 февраля 2012

Я создал базовый сайт django с помощью автоматического администратора и использовал кнопку «+» для добавления внешних ключей (растений) при добавлении ингредиента.Однако растения не были упорядочены, поэтому мне пришлось переопределить поле формы, как показано ниже.

Похоже, однако, что это означает, что кнопка «+», открывшая всплывающее окно, пропала - есть ли простой способ включить это, или лучший способ - заказать раскрывающийся список внешнего ключа?Спасибо.

class IngredientAdminForm(forms.ModelForm):
    plant = forms.ModelChoiceField(queryset=Plant.objects.order_by('name'), required=False)

    class Meta:
        model = Ingredient


class IngredientAdmin(admin.ModelAdmin):
    list_display = ('name', 'description', 'plant')
    form = IngredientAdminForm

1 Ответ

1 голос
/ 18 февраля 2012

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

class Plant(models.Model):
    name = models.CharField(max_length=30)

    class Meta:
        ordering = ['name',]

Если вы хотите изменить порядок в форме, тогда изменение набора запросов вполне допустимо.Обратите внимание, что вам не нужно явно определять поле завода в вашей форме - вы можете изменить набор запросов в вашем __init__ методе.

class IngredientAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(IngredientAdminForm, self).__init__(*args, **kwargs)
        self.fields['plant'].queryset = Plant.objects.order_by('name')

    class Meta:
        model = Ingredient

В админке Django вы на самом деле не имеетеопределить пользовательскую форму модели.Вы можете использовать метод администрирования модели formfield_for_foreignkey.

class IngredientAdmin(admin.ModelAdmin): 
    list_display = ('name', 'description', 'plant')

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "plant":
            kwargs["queryset"] = Plant.objects.order_by('name')
            return db_field.formfield(**kwargs)
        return super(IngredientAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...