Добавление 2 моделей внутри администратора

#python #django #django-models #django-admin

#python #django #django-модели #django-admin

Вопрос:

У меня есть 2 модели, вопрос и изображение. Я хочу создать менеджера в django admin, чтобы включить поля изображения в панель администратора вопроса.

Это модели:

 class Question(models.Model):

    quiz = models.ManyToManyField(Quiz, blank=True, )

    category = models.ForeignKey(Category, blank=True, null=True, )

    content = models.CharField(max_length=1000, 
                               blank=False, 
                               help_text="Enter the question text that you want displayed",
                               verbose_name='Question',
                               )

    explanation = models.TextField(max_length=2000,
                                   blank=True,
                                   help_text="Explanation to be shown after the question has been answered.",
                                   verbose_name='Explanation',
                               )


    class Meta:
        verbose_name = "Question"
        verbose_name_plural = "Questions"
        ordering = ['category']


    def __unicode__(self):
        return self.content



class Image(models.Model):
    TYPE_CHOICES = (
        ('A','Answer'),
        ('Q','Question'),
    )
    image = models.ImageField(upload_to='static/img')
    type = models.CharField(max_length=1, choices=TYPE_CHOICES)
    question = models.ForeignKey(Question, blank=True, null=True)
    answer = models.ForeignKey(Answer, blank=True, null=True)

    def __unicode__(self):
        return self.type
  

Это менеджер вопросов в Django Admin:

 class QuizAdminForm(forms.ModelForm):
    class Meta:
        model = Quiz

    questions = forms.ModelMultipleChoiceField(
                                               queryset=Question.objects.all(),
                                               required=False,
                                               widget=FilteredSelectMultiple(verbose_name=('Questions'),
                                                                             is_stacked=False                                                                           )
                                               )

    def __init__(self, *args, **kwargs):
        super(QuizAdminForm, self).__init__(*args, **kwargs)
        if self.instance.pk:
            self.fields['questions'].initial = self.instance.question_set.all()

    def save(self, commit=True):
        quiz = super(QuizAdminForm, self).save(commit=False)
        if commit:
            quiz.save()
        if quiz.pk:
            quiz.question_set = self.cleaned_data['questions']
            self.save_m2m()
        return quiz
  

Ответ №1:

Вы ищете InlineModelAdmin модели.

 class ImageInline(admin.TabularInline):
    model = Image
    ...

class QuestionAdmin(admin.ModelAdmin):
    list_display = ('content', 'category', )
    list_filter = ('category',)
    fields = ('content', 'category', 'quiz', 'explanation')

    search_fields = ('content', 'explanation')
    filter_horizontal = ('quiz',)

    inlines = [AnswerInline, ImageInline]
  

https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#inlinemodeladmin-objects

Приятно видеть, что вы используете приложение Django Quiz. Недавно я внес в него много изменений, и было бы хорошо, если бы вы могли внести что-нибудь в репозиторий: https://github.com/tomwalker/django_quiz