Джанго форма поиска - PullRequest
       9

Джанго форма поиска

1 голос
/ 16 октября 2011

Я создаю форму поиска в django, и я борюсь с обработкой формы в моем представлении.

Мой код:

class SearchForm(forms.Form):
    name = forms.CharField(label="Name", max_length=64, required=False)
    ...
    <a few other fields>


def search(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            qdict = { 'name': name}
            q_objs = [Q(**{qdict[k]: form.cleaned_data[k]}) for k in qdict.keys() if form.cleaned_data.get(k, None)]
            search_results = Group.objects.select_related().filter(*q_objs)
            response = {'success' : search_results}
            return HttpResponse(simplejson.dumps(response, ensure_ascii=False), mimetype='application/javascript')
    else:
        form = SearchForm()
    return render_to_response("main/search.html", {'form': form},
      context_instance=RequestContext(request))

Я получаю эту ошибку: Не удается разрешить ключевое слово u'NAME в поле. Возможные варианты: date_submitted, id, name, параметры.

Я понял, что это поле в юникоде, и попытался преобразовать его с помощью str (...) или кодирования ('ascii', ...), но оно все равно выдает мне ту же ошибку. Я новичок в Django, поэтому любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Чтобы найти свой код ошибки, замените этот код:

name = form.cleaned_data['name']
qdict = { 'name': name}
q_objs = [Q(**{qdict[k]: form.cleaned_data[k]}) for k in qdict.keys() if form.cleaned_data.get(k, None)]
search_results = Group.objects.select_related().filter(*q_objs)

На этот:

q=None
for k,v in form.cleaned_data.items():
  if q:
    q &= Q( k = v )
  else:
    q = Q( k = v )
search_results = Group.objects.select_related().filter( q )

Но, чтобы действительно контролировать свой запрос, необходимо написать условие с помощьюсостояние:

qs = []

name = form.cleaned_data['name']
if name:
  q_name = Q( name__contains = name )
  qs.append(q_name)

fromDate = form.cleaned_data['fromDate']
if fromDate:
  q_from = Q( date__gte = fromDate )
  qs.append(q_from)

toDate = form.cleaned_data['toDate']
if toDate:
  q_toDate = Q( date__gte = toDate )
  qs.append(q_toDate)

q=None
for x in qs:
  if q:
    q &= x
  else:
    q = x

search_results = Group.objects.select_related().filter(q)
0 голосов
/ 17 октября 2011

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

Group.objects.filter(NAME='some_value')

Если модель группы (которую вы не опубликовали, так что это образованныйдумаю) содержит строчное name поле, приведенный выше запрос сгенерирует ошибку, которую вы разместили, когда попытается получить доступ к верхнему регистру NAME поля.

Так что я думаю, что сводится к: что делает окончательный запросвыглядит как?Для получения информации об этом в комментарии Данихпа уже содержалась хорошая разбивка того, как это определить.

...