2012-03-07 28 views
21

Tôi có cách nào để xác định thứ tự của nội dung Các mục danh sách?Xác định đơn đặt hàng cho ManyToManyField với django

dụ:

  • ArticleContainer1 chứa theo thứ tự này:
    Điều 1, article2, article3, article6

  • ArticleContainer2 chứa theo thứ tự này:
    article3, article2, Điều 1, article4

  • ArticleContainer3 chứa theo thứ tự này:
    article5

Dưới đây là lớp học của tôi:

class Article(models.Model):  
    title = models.CharField(max_length=200) 

class ArticleContainer(models.Model): 
    contents = models.ManyToManyField(Article, blank=True, null=True) 

Trả lời

15

Vì vậy, đây là một ví dụ tôi có, một trang web tổ chức mọi người vào các phòng ban với mỗi bộ phận đặt hàng. Khái niệm tương tự như vấn đề của bạn nhưng với các mô hình khác nhau. Ví dụ này sử dụng nhiều-nhiều từ bảng.

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   

Và mô hình thông qua:

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) 

Và admin:

class DepartmentPeopleInline(admin.TabularInline): 
    model = DepartmentPeople 
    extra = 1 

class DepartmentAdmin(admin.ModelAdmin): 
    inlines = (DepartmentPeopleInline,) 

admin.site.register(Person, PersonAdmin) 
admin.site.register(Department, DepartmentAdmin) 

YÊU CẦU TRÊN BÌNH:

Lưu ý: sau đây là PersonAdmin của tôi, nhưng nó không cần thiết phức tạp cho ví dụ này. bạn có thể nhận được bởi với một đơn giản

class PersonAdmin(admin.ModelAdmin) : 
    pass 

NHƯNG đây là những gì tôi đang sử dụng trong ứng dụng của tôi:

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) 
+0

Tôi có đặt mã Quản trị bên cạnh sổ đăng ký không? xin lỗi tôi là noob ở Django –

+0

Tôi sẽ kiểm tra nó tối nay, có vẻ như Good –

+1

Bạn cần phải đặt định nghĩa lớp quản trị của bạn trước khi bạn đăng ký chúng. Tôi đã chỉnh sửa câu trả lời của mình để hiển thị như thế nào. –

7

Nếu bạn sử dụng một định nghĩa rõ ràng through mô hình cho mối quan hệ m2m bạn có thể thêm thuộc tính của riêng bạn order-id. Sau đó, bạn có thể mở rộng ManyToManyField để điền id đơn hàng cho mỗi logic của bạn trên tạo/cập nhật và trình quản lý mô hình m2m sẽ sắp xếp kết quả khi bạn tìm nạp chúng theo thuộc tính id đơn đặt hàng.

+10

bạn có một dụ hoặc một liên kết? –

Các vấn đề liên quan