2013-02-20 2 views
0

У меня есть структура ниже, где у каждого торговца есть отношение «многие ко многим» с двумя атрибутами; Язык и Дисциплина. В форме пользователь может выбрать подмножество Tradesman, фильтруя эти атрибуты.Django для многих запросов с нулевыми формами и значениями модели

То, что я хотел бы случиться, что:

  1. если фильтры пользователя только один атрибут, форма выбирает все нефильтрованного атрибутов. Например. если выбрать a выбрать язык, но оставить дисциплину пустой, она не будет фильтровать по дисциплине.
  2. если пользователь фильтрует на языке, где у торговца нет одного набора (т. Е. Он равен нулю), он исключает этого торговца.

Я думаю, что я могу решить это с помощью барочного непифонного, недианго-метода извлечения первичных ключей из запроса и использования их, но скорее использовал бы более чистый метод.

То, что я думаю, мог бы решить, было бы:

  1. Динамический Джанго фильтр, который будет понижаться или включать в себя условия, в зависимости от того, если-иначе логика
  2. Параметр, который будет соответствовать всем (в том числе нулям) что я мог бы хранить в переменной, например.

    return_everything=**everything()!** 
    Q(discipline__id__in=return_everything) 
    

Я смотрел в Джанго docmentation и на StackOverflow и не может найти способ сделать либо. Спасибо за любую помощь.

models.py:

class Discipline(models.Model): 
    discipline=models.CharField(max_length=200, unique=True) 

class Language(models.Model): 
    language=models.CharField(max_length=200, unique=True) 

class Tradesman(models.Model): 
    discipline=models.ManyToManyField(Discipline, blank=True, null=True) 
    language=models.ManyToManyField(Language, blank=True, null=True) 

forms.py

class TradesmanForm(forms.Form): 
    #select all values to output in the form 
    discipline_all=.Discipline.objects.all() 
    language_all=Language.objects.all() 

    #declare form variables 
    discipline=forms.ModelMultipleChoiceField(queryset=discipline_all,required=False) 
    language=forms.ModelMultipleChoiceField(queryset=language_all,required=False) 

    #clean data 
    def clean(self) 
     cleaned_data=super(TradesmanForm, self).clean() 
     return cleaned_data 

views.py

def TrademanLookup(request) 
    if request.method == 'POST':  
     if form.is_valid() 
      discipline=form.cleaned_data['discipline'] 
      language=form.cleaned_data['language'] 
      ################################################# 
      # how can I make the below query dynamic,  # 
      # or else pass a variable into it that selects # 
      # everything, including nulls?     # 
      ################################################# 
      tradesman_return=Tradesman.objects.filter(
       Q(discipline__id__in=discipline), 
       Q(language__id__in=language) 
       ) 
      ...work with returned data... 
     else: 
      ...something else... 
    else: 
      ...something else... 

    return render_to_response('some.html','somevar':somevar) 

ответ

1
def TrademanLookup(request) 
    if request.method == 'POST':  
     if form.is_valid() 
      discipline=form.cleaned_data['discipline'] 
      language=form.cleaned_data['language'] 
      query = [] 
      if disciplines: 
       query.append(Q(discipline__in=discipline)) 
      if language: 
       query.append(Q(language__in=language)) 

      if query:  
       tradesman_return=Tradesman.objects.filter(*query) 
      else: 
       tradesman_return=Tradesman.objects.all() 

      #...work with returned data... 

NB: это считается GoodPractice (TM), чтобы использовать формы множественного числа для коллекций (действительно должны быть «дисциплины» и «languag» es "как в модели Trademan, так и в форме.

NB2: Конвенция использовать all_lower_with_underscore имена для функций, поэтому ваш взгляд должен быть назван «trademan_lookup»

+0

Это работает, спасибо миллион. Что касается NB, то представление верхнего регистра было опечаткой при упрощении трески для stackoverflow, но doen't django pluralise models в admin? По этой причине я менял свой код на мои имена моделей от множественного числа до единственного; предполагая, что это означает, что это лучшая практика. В очередной раз благодарим за помощь. – sean

Смежные вопросы