Как создать повторяющееся универсальное поле в модели Django, которое не отображает записи из других объектов в админке? - PullRequest
0 голосов
/ 29 ноября 2018

Я довольно новичок в Django, но мне интересно, как заставить одну, казалось бы, очевидную вещь работать в определениях моей модели.

Для модели "Продукт" я хочу иметь возможность добавлять любое количество ссылокТаким образом, я сделал более-менее общую модель «Ссылка» с полем отображаемого имени и полем URL.В Product я добавляю это как ManyToManyField с соответствующей моделью Link.

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

Не понимаю ли я тип поля или общий подход, или как я могу заставить это работать?Мне было интересно, если варианты с по это способ сделать это, или это просто то, что вы должны делать в формах администратора, а не на уровне модели?

Редактировать:Пример кода добавлен ниже

Редактировать: Пример кода обновлен с formfield_for_manytomany

In models.py:

class Product(models.Model):
    name = models.CharField(max_length=256)
    links = models.ManyToManyField('Link', related_name='links', default=None, blank=True, null=True)

class Link(models.Model):
    name = models.CharField(max_length=256)
    url = models.URLField(max_length=256)

In admin.py:

class LinksInline(admin.StackedInline):
    model = Link

class ProductAdmin(admin.ModelAdmin):
    inlines = [LinksInline]

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        kwargs["queryset"] = Link.objects.filter(font_id=self.object_id)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

admin.site.register(Link)
admin.site.register(Product)

1 Ответ

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

Ошибка была очень очевидной, фильтрация в ProductAdmin так и не вступила в силу, потому что она не была зарегистрирована:

admin.site.register(Link)
admin.site.register(Product, ProductAdmin)

Редактировать: Теперь, когда я еще попытался заставить это работать, яЗаметьте, что весь вопрос не нужен, потому что встроенное поведение - именно то, что я хотел - только я думал, что это не сработало из-за отсутствия регистра ProductAdmin.Об этом позаботится простая регистрация Inline и определение модели Link с помощью ForeignKey к Продукту.Перейдя по ссылке в комментариях, я получил нефильтрованное поле выбора для фильтрации, как описано, используя сохраненный объект для фильтрации многих результатов по сравнению с - увы, это не нужно.

...