【问题标题】:How to create objects inline for many to many relationships in Django?如何在 Django 中为多对多关系创建内联对象?
【发布时间】:2015-03-03 11:37:50
【问题描述】:

我已经定义了问题和标签之间的这种关系:(这是正确的吗?)

myproject/myapp/models.py:

from django.db import models
from django.contrib.auth.models import User
from vote.managers import VotableManager
from django.utils import timezone
from datetime import datetime, timedelta


class Tag(models.Model):
    text = models.CharField(max_length = 20)
    user = models.ForeignKey(User)

class Question(models.Model):
    text = models.TextField()
    user = models.ForeignKey(User)  # First writer of the question
    tags = models.ManyToManyField(Tag)   
    votes = VotableManager() 
    created = models.DateTimeField(auto_now_add=True)  #  auto_now_add=True  
    modified = models.DateTimeField(auto_now=True) #  auto_now=True
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - timedelta(days=1)

我想要一个管理页面来创建Questions,以及Tags,所以这是我的admin.py:

from django.contrib import admin
from qportal.models import Tag, Question


class TagsInline(admin.TabularInline):
    model = Question.tags.through
    extra = 3


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

admin.site.register(Question, QuestionAdmin)

但是,当我运行runserver 并登录到http://127.0.0.1:8000/admin/qportal/question/add/ 时,我看到的页面是这样的:

如您所见,它只允许我选择一个预先存在的标签。但是,我希望能够在创建内联问题时第一次 create 标记。我该怎么做?

谢谢!

【问题讨论】:

  • 尝试从 Tag Model 中取出 user = models.ForeignKey(User) 看看是否有效。

标签: python django django-models django-admin inline-formset


【解决方案1】:

不要对标签使用内联。常规的M2M 字段可以在管理员中正常工作。要获得更合适的 M2M 小部件,请添加 filter_horizontal 属性:

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['text', 'tags']}),
    ]
    filter_horizontal = ['tags']
    ...

要从QuestionAdmin 创建Tag,请按小部件右侧的绿色+ 符号。

【讨论】:

  • 谢谢!在您添加编辑之前,我无法注意到绿色 + 符号,所以额外 +1 :D
猜你喜欢
  • 2010-12-15
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多