fbpx

Заполнение FK inline-модели из M2M родителя

192 просмотра
0
0 Комментариев

Есть интернет-магазин, в карточке товара можно выбрать один из доступных цветов, при этом происходит показ изображений только выбранного цвета.
Модели такие:

class color(models.Model):
    caption = models.CharField(max_length=1024, verbose_name = u'наименование')
    ...
 
class item(models.Model):
    ...
    colors = models.ManyToManyField(color, verbose_name = u'цвета')
    ...
 
class itemImage(models.Model):
    item = models.ForeignKey(item, verbose_name = u'товар')
    file = models.FileField(upload_to = prepare_file, verbose_name = u'фотография')
    color = models.ForeignKey(color, verbose_name = u'цвет')

admin.py

class itemImagesInline(admin.StackedInline):
    model = models.itemImage
 
class itemAdmin(admin.ModelAdmin):
    ...
    inlines = [
        itemImagesInline,
    ]

В админке получается так, что если товару добавить новый цвет, то приходится нажимать «Сохранить и продолжить редактирование», чтобы цвет появился в списке itemImage. И еще у itemImage выбираются все цвета, а не только те, которые есть у родителя.

Как сделать, чтобы выбирались только цвета, доступные у родителя? И, в идеале, без перезагрузки страницы.

Думал в сторону prepopulated_fields, но в доках написано: «prepopulated_fields doesn’t accept DateTimeField, ForeignKey, nor ManyToManyField fields.»

Пробовал через ForeignKey.to_field

class itemImage(models.Model):
    color = models.ForeignKey(item, to_field = "colors")

Ругается так: AssertionError: ForeignKey() is invalid. First parameter to ForeignKey must be either a model, a model name, or the string ‘self’

Выручайте)


Добавить комментарий

1 Ответы

Python Опубликовано 19.01.2019
0

Делается так:

class itemImagesInline(admin.StackedInline):
    model = models.itemImage
    readonly_fields = ('image_tag',)
    def get_formset(self, request, obj=None, **kwargs):
        FormSet = super(itemImagesInline, self).get_formset(request, obj, **kwargs)
        FormSet.form = get_images_form(obj)
        return FormSet
 
def get_images_form(item):
    q = item.colors.all()
    class imagesModelForm(ModelForm):
        class Meta:
            model = models.itemImage
        def __init__(self, *args, **kwargs):
            super(ModelForm, self).__init__(*args, **kwargs)
            if self.fields.has_key("color"):
                self.fields["color"].queryset = q
    return imagesModelForm

Спасибо django russian

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up