Добавление полей из отношения "многие-ко-многим" в Django Admin Inline
Я пытаюсь создать проект, в котором у меня есть пользователь, вопросы для пользователей, а затем ответы, которые дают пользователи. Вот мои модели
class User(models.Model):
name = models.CharField(max_length=20)
email = models.EmailField()
def __str__(self):
return self.name
class Question(models.Model):
question = models.TextField()
def __str__(self):
return self.question
class Answer(models.Model):
answer = models.TextField()
user = models.ManyToManyField(User)
question = models.ManyToManyField(Question)
def __str__(self):
return self.answer
Затем в админке я хочу иметь возможность нажать на пользователя и посмотреть его ответы, поэтому я настроил свою админку так.
class AnswerInline(admin.TabularInline):
model = Answer.user.through
class UserAdmin(admin.ModelAdmin):
list_display = ('name', 'email')
inlines = [AnswerInline]
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question',)
class AnswerAdmin(admin.ModelAdmin):
list_display = ('answer', )
fields = ('question', 'answer',)
admin.site.register(User, UserAdmin)
admin.site.register(Question, QuestionAdmin)
admin.site.register(Answer, AnswerAdmin)
Однако при просмотре пользователей отображается только их ответ. Он не показывает вопрос, с которым связан ответ. Как мне добавить эту информацию на страницу администратора таким образом, чтобы это имело смысл. Желательно, чтобы сначала был вопрос, а затем справа от него - ответ на него.
Оказывается, я неправильно настроил модели. Вот как они должны выглядеть.
from django.db import models
class User(models.Model):
name = models.CharField(max_length=20)
email = models.EmailField()
def __str__(self):
return self.name
class Question(models.Model):
question = models.TextField(default=None)
people = models.ManyToManyField(User, through='Answer')
def __str__(self):
return self.question
class Answer(models.Model):
answer = models.TextField()
user = models.ForeignKey(User, on_delete=models.CASCADE, default=None)
question = models.ForeignKey(Question, on_delete=models.CASCADE, default=None)
def __str__(self):
return self.answer
и вот админ, который работает.
class AnswerInline(admin.TabularInline):
model = Answer
fields = ('question', 'answer')
readonly_fields = ('question', 'answer')
extra = 0
class UserAdmin(admin.ModelAdmin):
list_display = ('name', 'email')
inlines = [AnswerInline]
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question',)
class AnswerAdmin(admin.ModelAdmin):
list_display = ('answer',)
fields = ('question', 'answer', 'user')