使用Django为ManyToManyField定义订单
有没有一种方法可以定义通过ManyToManyField相关的对象的顺序?
例:
-
ArticleContainer1按此顺序包含:article1,article2,article3,article6
-
ArticleContainer2依次包含:article3,article2,article1,article4
-
ArticleContainer3按此顺序包含:
article5
这是我的课程:
class Article(models.Model):
title = models.CharField(max_length=200)
class ArticleContainer(models.Model):
contents = models.ManyToManyField(Article, blank=True, null=True)
-
因此,这是我的一个示例,该站点按部门排序将人员组织到部门中。与问题的概念相同,但模型不同。本示例使用多对多表。
class Department(models.Model): slug = models.SlugField( verbose_name = _(u'Slug'), help_text = _(u'Uri identifier for this department.'), max_length=255 ) name = models.CharField( verbose_name = _(u'Department Name'), help_text = _(u'The department\'s name.'), max_length = 255 ) description = models.TextField( verbose_name = _(u'Description'), help_text = _(u'Department\'s description') ) people = models.ManyToManyField( Person, through = 'DepartmentPeople', related_name = 'people', verbose_name = _(u'People'), help_text = _(u'People in this Department') ) order_by = models.IntegerField( verbose_name = _(u'Ordering Weight'), help_text = _(u'This item\'s weight within a list.'), max_length = 255 ) class Meta: verbose_name = _(u"Department") verbose_name_plural = _(u"Departments") ordering = ['order_by',] def people_list(self): return [dp.person for dp in DepartmentPeople.objects.filter(department=self).order_by('order')] def __unicode__(self): return self.name
通过模型:
class DepartmentPeople(models.Model): person = models.ForeignKey( Person, verbose_name = _(u'Person'), help_text = _(u'Person is a member of this deparment.'), ) department = models.ForeignKey( Department, verbose_name = _(u'Department'), help_text = _(u'Pseron is a member of this department.'), ) order = models.IntegerField( verbose_name = _(u'Order'), help_text = _(u'What order to display this person within the department.'), max_length = 255 ) class Meta: verbose_name = _(u"Department Person") verbose_name_plural = _(u"Department People") ordering = ['order',] def __unicode__(self): return self.person.first_name + " " + self.person.last_name + " is a member of " + self.department.name + (" in position %d" % self.order)
和管理员:
class DepartmentPeopleInline(admin.TabularInline): model = DepartmentPeople extra = 1 class DepartmentAdmin(admin.ModelAdmin): inlines = (DepartmentPeopleInline,) admin.site.register(Person, PersonAdmin) admin.site.register(Department, DepartmentAdmin)
征求意见:
注意:以下是我的PersonAdmin,但在此示例中其不必要地复杂。你可以通过一个简单的
class PersonAdmin(admin.ModelAdmin) : pass
但是,这就是我在我的应用程序中使用的:
class PersonForm(forms.ModelForm): abstract = forms.CharField( widget=TinyMCE(attrs={'cols': 80, 'rows': 30}) ) class Meta: model = Person class PersonAdmin(reversion.VersionAdmin): form = PersonForm # The Form Fieldsets fieldsets = [ ( None, { 'fields' : [('first_name', 'last_name', 'post_nominal', ), 'slug', 'title', 'headshot', 'large_photo', ('email', 'phone', ), 'abstract'] }, ) ] # Prepopulated fields prepopulated_fields = {'slug': ('first_name', 'last_name', 'post_nominal', )} # Fields that are readonly #readonly_fields = ('slug', ) def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name == 'headshot': request = kwargs.pop("request", None) kwargs['widget'] = AdminImageWidget return db_field.formfield(**kwargs) return super(PersonAdmin, self).formfield_for_dbfield(db_field, **kwargs)