2010-11-08 15 views
11

My acemi kafa sadece sadece gösteri için location_unit modelinde, iki alan, konumu ve birimini sınırlamak için nasıl idrak edemezdjango'da, aynı modeldeki başka bir alana dayalı yabancıların seçimlerini nasıl sınırlandırabilirsiniz?

class unit(models.Model): 
    name = models.CharField(max_length=200) 

class project(models.Model): 
    name = models.CharField(max_length=200) 

class location(address): 
    project = models.ForeignKey(project) 

class project_unit(models.Model): 
    project = models.ForeignKey(project)   
    unit = models.ForeignKey(unit) 

class location_unit(models.Model): 
    project = models.ForeignKey(project)  
     #Limit the selection of locations based on which project has been selected 
    location = models.ForeignKey(location) 
     #The same here for unit. But I have no idea how. 
    unit = models.ForeignKey(project_unit)  

(ben sadece bu gerekli alan sayısını sınırlı) bu modelleri var location_unit'te seçilen projeye başvuran seçimler. Model formunu geçersiz kılmalı ve orada bir sorgu yapmalı mıyım yoksa limit_choices_to'yu kullanabilir miyim? Her iki şekilde de denedim başarısız oldu

Düzenleme: Sadece açıklığa kavuşturmak için, bu Django Yöneticisi'nde olmasını istiyorum. Ben de formfield_for_foreignkey denedim, ama hala benim için bir hayır.

DÜZENLEME 2:

def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "unit": 
     kwargs["queryset"] = project_unit.objects.filter(project=1) 
     return db_field.formfield(**kwargs) 
    return super(location_unit_admin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

Yukarıdaki kod parçası çalışır. Ama elbette projenin 1'e işaret etmesini istemiyorum. Project_id modellerine nasıl başvururum? , Iyi bir yön olabilir gibi

cevap

3

Sizin formfield_for_foreignkey görünüyor (evet ben bir Django acemi değilim, aslında ben varyasyonları çok çalıştık)

kwargs["queryset"] = project_unit.objects.filter(project=self.model.project.project_id) 

Ama bu işe yaramazsa: Bu çalıştı ama ModelAdmin'in (self) size belirli bir örnek vermeyeceğini bilmelisiniz. Sen tek yöneticinin bu işlevi istediğiniz (ve genel olarak doğrulama modeli değil) ise (muhtemelen django.core.urlresolvers.resolve bir kombinasyonu ve request.path) request


o türetmek gerekir, özel bir formu kullanabilirsiniz

forms.py:

from django import forms 

from models import location_unit, location, project_unit 

class LocationUnitForm(forms.ModelForm): 
    class Meta: 
     model = location_unit 

    def __init__(self, *args, **kwargs): 
     inst = kwargs.get('instance') 
     super(LocationUnitForm, self).__init__(*args, **kwargs) 
     if inst: 
      self.fields['location'].queryset = location.objects.filter(project=inst.project) 
      self.fields['unit'].queryset = project_unit.objects.filter(project=inst.project) 

admin.py:

modeli yönetici sınıfla 0

(Sadece hayır test ile anında bu yazdım, bu yüzden hiçbir garantisi çalıştıkları ederiz ancak yakın olmalıdır.)

+0

Merhaba Eternicode, Sorunuma zaman ayırdığınız için teşekkür ederim. Ama benim bir sorum var, bu sizin dinamik kodunuz, çünkü bana bir location_unit yaratmak istediğimde, __init__ zaten çalıştırılmış ve hangi projeyi seçtiğim önemli değil, tekrar çalıştırılamayacak gibi görünüyor. Bu yüzden önce bir proje seçmem gerekiyor, daha sonra tekrar kaydedin ve daha sonra __init__'yi tekrar çalıştırmak için location_unit'i yeniden girin, sonra birimler sadece söz konusu projeye ait olanları gösterecektir. Bunu doğru şekilde anladım mı? – Brian

+0

Belki böyle bir şey kullanılabilir: http://stackoverflow.com/questions/3750097/how-to-read-write-input-fields-in-django-admin-tabular-inlines-using-ajax ama benim fikri nasıl yönetilir – Brian

+3

Tamam, bu tam olarak ne istediğimi yapar :) https://github.com/digi604/django-smart-selects – Brian

İlgili konular