Отображение данных из связанной модели в Django интерфейсе администратора для объекта модели - PullRequest
0 голосов
/ 05 мая 2020

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

Прямо сейчас, чтобы создать сообщение в блоге и назначить любое количество тегов, здесь это моя модель для сообщений:

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=100, unique=True, null=True, blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    updated_on = models.DateTimeField(auto_now=True)
    tags = models.ManyToManyField("Tags", blank=True)
    content = RichTextUploadingField()
    created_on = models.DateTimeField(auto_now_add=True)

И модель, определяющая теги:

class Tag(models.Model):
    name = models.CharField(max_length=20, unique=True)

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

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

Я попытался сделать это, указав ManyToManyField в Tag Модель выглядит так:

class Tag(models.Model):
    name = models.CharField(max_length=20, unique=True)
    posts = models.ManyToManyField("Post", blank=True, related_name="posts")

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

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

Изменить : Я пересмотрел этот вопрос, чтобы прояснить, чего я пытаюсь достичь. Теперь я считаю, что моя модель настроена правильно. Но я (вероятно, ошибочно) думал, что могу добавить другое поле ко второй модели, чтобы оно появилось в интерфейсе администратора.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Поле «Многие ко многим» - это поле, используемое для определения двусторонней связи. Однако вы, кажется, сбиты с толку тем, что вам нужно определить только одну модель при написании ее в коде django. См. связь ManyToMany do c

Вот две модели.

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    tags = models.ManyToManyField("Tag", related_name='posts')


class Tag(models.Model):
    name = models.CharField(max_length=20, unique=True)

Этот код создаст три таблицы в вашей базе данных. posts, tags и post_tags. post_tags - промежуточный стол. Он имеет поля id, post_id, tag_id.

p1 = Post.objects.create(title='Post 1')
p2 = Post.objects.create(title='Post 2')
p3 = Post.objects.create(title='Post 3')

t1 = Tag.objects.create(title='Tag 1')
t2 = Tag.objects.create(title='Tag 2')
t3 = Tag.objects.create(title='Tag 3')

p1.tags.add(t1, t2)
p1.tags.all()
>>> [Tag 1, Tag 2]

t1.posts.all()
>>> [Post 1]
t2.posts.add(p2, p3)
t2.posts.all()
>>> [Post 1, Post 2, Post 3]

post_tags элементы таблицы:

id | post_id | tag_id 
---------------------
1  | 1       | 1
2  | 1       | 2
3  | 2       | 1
4  | 3       | 1

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

И this do c объясняет, как реализовать администратора, который может выбирать сообщения со страницы тегов.

0 голосов
/ 06 мая 2020

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

class TagInline(admin.StackedInline):
    model = Tag.post.through

И затем указать его в inlines под PostAdmin:

inlines = [TagInline]

Теперь отношения отображаются в объектах «Сообщения» в интерфейсе администратора.

Спасибо @YongjinJo за то, что направил меня на правильный путь!

...