2009-03-18 44 views
17

Tôi có mối quan hệ nhiều đến nhiều giữa 2 bảng Người dùng miền. Tôi đã xác định mối quan hệ này trong lớp Miền. Vì vậy, trong giao diện quản trị, tôi thấy Người dùng khi tôi đang xem Miền. Nhưng tôi không thấy Tên miền khi tôi xem Người dùng. Làm cách nào để đạt được điều này.Mẫu quản trị Django cho nhiều mối quan hệ

Trả lời

4

Tôi nghĩ rằng những gì bạn đang tìm kiếm là InlineModelAdmin.

+0

Có lẽ không phải điều mà OP mong đợi (một cách để sử dụng bộ chọn lọc ManyToMany thông thường từ hai bên của quan hệ), nhưng đây là giải pháp tôi cũng sẽ sử dụng. –

+3

Làm thế nào để tôi tham khảo bảng quan hệ (Domains_User trong trường hợp của tôi) Tôi không có bảng trung gian rõ ràng. Trong trường hợp này làm thế nào để tôi sử dụng InlineModelAdmin cho ManyToManyRelationship –

8

Cách tích hợp duy nhất là thông qua InlineModelAdmin, nhưng bạn có thể sử dụng ModelForm tùy chỉnh với Mô hình người dùngAdmin để tạo trường cho mục đích này. Xem mã bên dưới để thiết lập đơn giản (giả sử users = ManyToManyField(related_name='domains')).

### yourapp/admin.py ### 

from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import User 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib.admin.widgets import FilteredSelectMultiple 

from .models import Domain 

class DomainAdmin(admin.ModelAdmin): 
    filter_horizonal = ('users',) 

class UserAdminForm(forms.ModelForm): 
    domains = forms.ModelMultipleChoiceField(
     queryset=Domain.objects.all(), 
     required=False, 
     widget=FilteredSelectMultiple(
      verbose_name=_('Domains'), 
      is_stacked=False 
     ) 
    ) 

    class Meta: 
     model = User 

    def __init__(self, *args, **kwargs): 
     super(UserAdminForm, self).__init__(*args, **kwargs) 

     if self.instance: 
      self.fields['domains'].initial = self.instance.domains.all() 

    def save(self, commit=True): 
     user = super(UserAdminForm, self).save(commit=False) 

     user.domains = self.cleaned_data['domains'] 

     if commit: 
      user.save() 
      user.save_m2m() 

     return user 

class UserAdmin(admin.ModelAdmin): 
    form = UserAdminForm 

admin.site.register(Domain, DomainAdmin) 
admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 
+1

Điều này không hoàn toàn phù hợp với tôi khi thêm 'user' (không phải là 'User' trong trường hợp của tôi). Tôi cần kiểm tra 'self.instance.id' trong phương thức' __init__', và tôi cần 'save()' đối tượng mới trước khi gán tên miền cho nó. – alalonde

14

Tôi biết rằng đây là một chuỗi cũ hơn, nhưng đây là kết quả đầu tiên xuất hiện trên google và tôi nghĩ câu trả lời tốt hơn là cần thiết.

Via this django bug report tôi thấy cách tốt nhất để có ManyToManyField của bạn hiển thị trên cả hai mô hình:

class Test1(models.Model): 
    tests2 = models.ManyToManyField('Test2', blank=True) 

class Test2(models.Model): 
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True) 

Tôi đã thử nghiệm nó bản thân mình và rất hài lòng với kết quả.

+0

Tôi nhận được thông báo lỗi "Test2" không được xác định có vẻ logic vì Test2 không được xác định khi được gọi. Giải pháp của bạn sẽ rực rỡ nếu làm việc – Timo

0

Đối với những người vẫn còn đụng vào này, nó có thể là giá trị kiểm tra https://github.com/kux/django-admin-extend

Nó cung cấp một cơ chế để tiêm hai chiều nhiều-nhiều lĩnh vực trong ModelAdmins đã được xác định bởi các ứng dụng khác.

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