Выберите только один элемент, связанный с внешним ключом - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть две базовые c модели, Продукт и Изображение, причем последние назначены Продукту через внешний ключ:

class Image(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to=sku_dir)
    description = models.CharField(max_length=100, default='', blank=True)
    product = models.ForeignKey(product.Product, on_delete=models.CASCADE, related_name='images')

В админке я использую встроенную модель изображения:

class ImageInline(admin.TabularInline):
    model = image.Image
    extra = 1

@admin.register(product.Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ['sku', 'name']
    list_display = ['sku', 'name', 'price']
    autocomplete_fields = ['genus']
    inlines = [ImageInline,]

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

Поскольку я все еще учусь Django, я чувствую, что есть простой способ сделать это, но я не знаю правильной терминологии, определяющей c до Django для поиска ответа (аналогично тому, как мне потребовалось некоторое время, чтобы обнаружить, что «встроенный» - это термин, используемый для отображения формы одной модели внутри другой).

Как добавить радиокнопку к каждому изображению, которая позволяет выбирать только одно изображение во встроенной форме?

1 Ответ

1 голос
/ 17 апреля 2020

Один из способов получить аналогичную функциональность (хотя не совсем то, что вы ищете) - добавить новое поле в модель вашего продукта под названием default_image. У вас есть это поле, установленное как ForeignKey для модели Image (вам нужно будет использовать related_name, чтобы избежать обратного имени запроса cla sh). Вы используете пользовательскую форму для модели Продукта, которая ограничивает набор запросов поля default_image изображениями, связанными с конкретным продуктом.

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

Я настроил быстрый тест (используя модели из учебника Django , чтобы избежать неверной интерпретации настроек):

models.py:

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)

    # this field will hold the preferred choice for this question - 
    # setting one is optional
    preferred_choice = models.ForeignKey('Choice', on_delete=models.CASCADE, related_name='preferred_choice')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)

admin.py:

from django.contrib import admin
from django import forms
from .models import Question, Choice


# Setup a custom form
class QuestionForm(forms.ModelForm):
    class Meta:
        model = Question
        fields = "__all__"


    # call super and then set the queryset of choices to be the ones related to 
    # the question we are working on
    def __init__(self, *args, **kwargs):
        super(QuestionForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['preferred_choice'].queryset = Choice.objects.filter(question=self.instance)


class ChoiceInline(admin.TabularInline):
    model = Choice


class QuestionAdmin(admin.ModelAdmin):
    form = QuestionForm
    inlines = [ChoiceInline]


admin.site.register(Question, QuestionAdmin)

Другим возможным решением было бы добавить поле логического / флажка в модель изображения с именем «default_image», но вам нужно будет внедрить какой-то пользовательский логик сохранения c для убедитесь, что только в одном изображении установлено значение True

Так оно и было обработано в в этом вопросе , а JS использовался для 1) установки флажков выглядят как переключатели и 2) убедитесь, что для других параметров установлено значение False, если для одного из них установлено значение True

Не идеальные решения, но, надеюсь, это поможет, по крайней мере, указать вам правильное направление ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...