5

Tôi đã có một mô hình vài django mà trông như thế này:Django MTMField: limit_choices_to = other_ForeignKeyField_on_same_model?

from django.contrib.sites.models import Site 

class Photo(models.Model): 
    title = models.CharField(max_length=100) 
    site = models.ForeignKey(Site) 
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self): 
     return self.title 


class Gallery(models.Model):  
    name = models.CharField(max_length=40) 
    site = models.ForeignKey(Site) 
    photos = models.ManyToManyField(Photo, limit_choices_to = {'site':name})  

    def __unicode__(self): 
     return self.name 

Tôi đang gặp tất cả các loại vui cố gắng để có được những limit_choices_to làm việc trên mô hình Bộ sưu tập. Tôi chỉ muốn Quản trị viên hiển thị các lựa chọn cho ảnh thuộc cùng một trang với thư viện này. Điều này có thể không?

Trả lời

1

tôi sẽ xóa site lĩnh vực trên mô hình Photo của tôi và thêm một ForeignKey-Gallery. Tôi sẽ xóa limit_choices_to khỏi các trường photos trên mô hình Gallery.

Vì bạn đang sử dụng ForeignKey s đến Site s, điều đó có nghĩa là các trang web không chia sẻ phòng trưng bày và ảnh. Vì vậy, những người tôi đã đề cập ở trên đã vô dụng rồi.

class Photo(models.Model): 
    title = models.CharField(max_length=100) 
    gallery = models.ForeignKey(Gallery, related_name='photos') 
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self): 
     return self.title 


class Gallery(models.Model):  
    name = models.CharField(max_length=40) 
    site = models.ForeignKey(Site) 

    def __unicode__(self): 
     return self.name 

Khi bạn đặt site trên thư viện, tất cả ảnh của nó sẽ kế thừa thuộc tính này. Và trang web sẽ có thể truy cập như photo_instance.gallery.site:

@property 
def site(self): 
    return self.gallery.site 

này nên làm việc như thể bạn đã có một lĩnh vực site. Nhưng tôi chưa thử nghiệm nó.

Mọi thứ thay đổi hoặc tất nhiên, nếu bạn quyết định rằng một thư viện hoặc ảnh có thể xuất hiện ở nhiều trang web.

+0

ahh - đây là một thiết kế tốt hơn. Cảm ơn. – saturdayplace

+3

Nhận xét muộn ... Điều này giải quyết vấn đề người hỏi với thiết kế tốt hơn, nhưng không trả lời câu hỏi! Tôi có cùng một vấn đề nhưng thay đổi thiết kế không thể thực hiện được, giống như một CustomUser có một tập hợp các tùy chọn có thể (M2M đến Options) mà chỉ có một trình quản lý cấp cao có thể thay đổi, nhưng trong số đó có một tập hợp các tùy chọn hoạt động (M2M thứ hai để Tùy chọn, lựa chọn trong số những người trong danh sách đầu tiên). Các tập hợp con của cùng một tập hợp các tùy chọn cũng phải được gán cho các đối tượng khác, vì vậy không thể đảo ngược quan hệ. – rewritten

0

Theo docs, "limit_choices_to không có hiệu lực khi được sử dụng trên ManyToManyField với bảng trung gian". Bằng cách đọc của tôi, điều đó có nghĩa là nó không có tác dụng gì cả, vì ManyToManyFields sử dụng các bảng trung gian ...

Tôi đã không cố gắng làm cho nó hoạt động trong trang Quản trị, nhưng từ chế độ xem của riêng bạn, bạn có thể tạo biểu mẫu và override the queryset sử dụng để đưa vào danh sách các lựa chọn:

form.fields["photos"].queryset = request.user.photo_set.all() 
3

Có. Bạn cần phải ghi đè lên các hình thức mà quản trị sử dụng cho mô hình Gallery, sau đó hạn chế queryset của trường photos theo hình thức đó:

class GalleryAdminForm(django.forms.ModelForm): 

    class Meta: 
     model = Gallery 

    def __init__(self, *args, **kwargs): 
     super(GalleryAdminForm, self).__init__(*args, **kwargs) 
     self.fields['segments'].queryset = Photo.objects.filter(site=self.instance.site) 


class GalleryAdmin(django.contrib.admin.ModelAdmin): 
    form = GalleryAdminForm 

django.contrib.admin.site.register(Gallery, GalleryAdmin) 
Các vấn đề liên quan