簡體   English   中英

在管理頁面上為Django模型創建雙向ManyToMany關系

[英]Creating a Bidirectional ManyToMany Relationship for Django Models on Admin Page

我正在使用適用於1.8和Python 3.4的Django教程,現在該頁面上的Questions可以添加多個Choices,但是Choices無法訪問其相應的Question:

#models.py
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    question = models.ForeignKey('Question')
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text
#admin.py
from django.contrib import admin

from .models import Question, Choice

# Register your models here.

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

# class QuestionInline(admin.TabularInline):
#     model = Question.choice.through
#     extra = 3

class QuestionAdmin(admin.ModelAdmin):
    # fieldsets = [   (None, {'fields': ['question_text']}),
    #                 ('Date information', {'fields': ['pub_date'],'classes':
    #                 ['collapse']})
    #             ]
    list_display = ('question_text', 'pub_date', 'was_published_recently')
    list_filter = ['pub_date']
    search_fields = ['question_text']
    inlines = [ChoiceInline]

class ChoiceAdmin(admin.ModelAdmin):
    fields = ['choice_text', 'votes']

    #inlines = [QuestionInline]

admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice, ChoiceAdmin)

但是,我希望問題可以有很多選擇,並能夠在管理員中訪問這些選擇,然后選擇也可以在管理頁面中訪問其相應的問題。

我當時正在考慮為Choice創建一個ManyToMany變量,但這似乎消除了具有TabularInline Editing(需要外鍵)的功能。

我不確定如何解決這個問題。

我想我部分實現了自己想要的目標:

models.py:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    #question = models.ForeignKey('Question')
    related_question = models.ManyToManyField(Question, related_name='questions')
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

class Related(models.Model):
    question = models.ForeignKey(Question)
    choice = models.ForeignKey(Choice)

admin.py:

class RelatedInline(admin.TabularInline):
    model = Related
    extra = 1


class QuestionAdmin(admin.ModelAdmin):
    # fieldsets = [   (None, {'fields': ['question_text']}),
    #                 ('Date information', {'fields': ['pub_date'],'classes':
    #                 ['collapse']})
    #             ]
    #list_display = ('question_text', 'pub_date', 'was_published_recently')
    #list_filter = ['pub_date']
    #search_fields = ['question_text']
    #inlines = [ChoiceInline]
    inlines = (RelatedInline,)

class ChoiceAdmin(admin.ModelAdmin):
    #fields = ['choice_text', 'votes']
    #filter_horizontal = ('related_question',)
    #list_display = ('question',)
    #list_display_links = ('question',)
    #inlines = [QuestionInline]
    #list_filter = ('related_question', admin.RelatedOnlyFieldListFilter)
    inlines = (RelatedInline,)
    exclude = ('related_question',)
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice, ChoiceAdmin

這樣就可以將相關的選擇添加到問題中,並將問題添加到選擇中。

但是,我還想知道在Question模型內部是否可以編輯Choice模型? 或在選擇特定選項時直接鏈接到模型本身。

來源: https : //docs.djangoproject.com/en/1.8/ref/contrib/admin/#working-with-many-to-many-intermediary-models

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM