2015-08-03 45 views
0

使用:Django的1.8和Python 3.4嵌套多对多场在Django

我有以下型号:

class SpaCenter(models.Model): 
    name = models.CharField(max_length=100) 
    website = models.CharField(max_length=200) 
    facebook_url = models.CharField(max_length=200) 
    faq = models.ManyToManyField(SpaCenterFAQ) 


class SpaCenterFAQ(models.Model): 
    pass 


class SpaCenterFAQLanguage(models.Model): 
    faq = models.ForeignKey(SpaCenterFAQ) 
    faq_language = models.CharField(max_length=2, 
         choices=LANGUAGE_CHOICES, 
         default=ENGLISH) 
    faq_question = models.CharField(max_length=200) 
    faq_answer = models.TextField() 

总结:

  • 每个SpaCenter可以multipe常见问题
  • 每个FAQ都可以属于多个Spa中心
  • 每个FAQ都需要在多个语言,因此SpaCenterFAQL语言模型处理语言翻译

使用Django内置管理界面我希望能够在SpaCenter管理界面中输入常见问题解答的所有不同翻译。

所以基本上这是一个嵌套的关系,我知道这个线程:

除了这两个试图解决这个问题,这些社区创建的应用程序的:

但是,我仍然在努力了解如何在Django Admin中定义这一点,即使在使用这些库时也是如此。

需要帮助了解这种关系如何显示在SpaCenter的管理界面中。

非常感谢。

编辑:

  • 的SpaCenterFAQ模型没有因为处理语言附表的领域。例如:一个spacenter可以有几个常见问题解答。但是,每个FAQ都需要使用多种语言。

回答

1

使用djangosuperlines它应该看起来像:

from django.contrib.admin import TabularInline, StackedInline, site 
from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin 

from .models import * 


class SpaCenterFAQLanguageInlineAdmin(SuperInlineModelAdmin, TabularInline): 
    model = SpaCenterFAQLanguage 


class SpaCenterFAQInlineAdmin(SuperInlineModelAdmin, StackedInline): 
    model = SpaCenter 
    inlines = (SpaCenterFAQLanguageInlineAdmin,) 


class SpaCenterAdmin(SuperModelAdmin): 
    inlines = (SpaCenterFAQInlineAdmin,) 


site.register(SpaCenter, SpaCenterAdmin) 
+0

对不起,jumpted定论为时尚早 - 这个工作对我的模型的另一部分,其中有2个外键关系。因此,如果一个SpaCenter可以有多个常见问题解答,但每个常见问题解答只能有一个水疗中心 - 那么您的代码就是事实。 但是,这里的问题是多对多,所以我假设某处必须有一个.through参数 – Aivoric

+0

model = SpaCenter.faq.through – delta32

+0

,这是行不通的... – Aivoric

0
from django.db import models 

class SpaCenter(models.Model): 
    name = models.CharField(max_length=100) 
    website = models.CharField(max_length=200) 
    facebook_url = models.CharField(max_length=200) 
    faqs = models.ManyToManyField('SpaCenterFAQ', blank=True) 


class SpaCenterFAQ(models.Model): 
    spa_centers = models.ManyToManyField('SpaCenter', blank=True) 

class SpaCenterFAQLanguage(models.Model): 
    ENGLISH = '1' 
    LANGUAGE_CHOICES = ((ENGLISH, 'english'),) 

    faq = models.ForeignKey(SpaCenterFAQ) 
    faq_question = models.CharField(max_length=200) 
    faq_answer = models.TextField() 
    faq_language = models.CharField(max_length=2, 
         choices=LANGUAGE_CHOICES, 
         default=ENGLISH 


from django.contrib import admin 

from .models import * 


class SpaCenterFAQLanguageInlineAdmin(admin.TabularInline): 
    model = SpaCenterFAQLanguage 

class SpaCenterFaqAdmin(admin.ModelAdmin): 
    inlines = SpaCenterFAQLanguageInlineAdmin, 


class SpaCenterAdmin(admin.ModelAdmin): 
    pass 

admin.site.register(SpaCenter, SpaCenterAdmin) 
admin.site.register(SpaCenterFAQ, SpaCenterFaqAdmin)