Ich versuche eine Class Based ListView
zu realisieren, die eine Auswahl eines Tabellensatzes anzeigt. Wenn die Site zum ersten Mal angefordert wird, sollte das Dataset angezeigt werden. Ich würde eine POST-Einreichung bevorzugen, aber GET ist auch in Ordnung.Django: Suchformular in Class Based ListView
Das ist ein Problem, das war einfach zu handhaben mit function based views
, aber mit klassenbasierten Ansichten habe ich eine harte Zeit, um mich zu rächen.
Mein Problem ist, dass ich eine verschiedene Anzahl von Fehler, die durch mein begrenztes Verständnis der klassifizierten Ansichten verursacht werden. Ich habe verschiedene Dokumentationen gelesen und verstehe Ansichten für direkte Abfrageanforderungen, aber sobald ich der Abfrage ein Formular hinzufügen möchte, stoße ich auf einen anderen Fehler. Für den unten stehenden Code erhalte ich eine ValueError: Cannot use None as a query value
.
Was wäre der Best-Practice-Workflow für ein klassenbasiertes ListView abhängig von den Formulareinträgen (andernfalls wird die gesamte Datenbank ausgewählt)?
Das ist mein Beispielcode:
models.py
class Profile(models.Model):
name = models.CharField(_('Name'), max_length=255)
def __unicode__(self):
return '%name' % {'name': self.name}
@staticmethod
def get_queryset(params):
date_created = params.get('date_created')
keyword = params.get('keyword')
qset = Q(pk__gt = 0)
if keyword:
qset &= Q(title__icontains = keyword)
if date_created:
qset &= Q(date_created__gte = date_created)
return qset
forms.py
class ProfileSearchForm(forms.Form):
name = forms.CharField(required=False)
views.py
Unten habe ich die FBV hinzugefügt, die die Arbeit erledigt. Wie kann ich diese Funktionalität in ein CBV übersetzen? Es scheint so einfach in funktionsbasierten Ansichten, aber nicht in klassenbasierten Ansichten.
def list_profiles(request):
form_class = ProfileSearchForm
model = Profile
template_name = 'pages/profile/list_profiles.html'
paginate_by = 10
form = form_class(request.POST or None)
if form.is_valid():
profile_list = model.objects.filter(name__icontains=form.cleaned_data['name'])
else:
profile_list = model.objects.all()
paginator = Paginator(profile_list, 10) # Show 10 contacts per page
page = request.GET.get('page')
try:
profiles = paginator.page(page)
except PageNotAnInteger:
profiles = paginator.page(1)
except EmptyPage:
profiles = paginator.page(paginator.num_pages)
return render_to_response(template_name,
{'form': form, 'profiles': suppliers,},
context_instance=RequestContext(request))
Frage, versuchen Sie, einen Wert aus einem Abfrage-Set basierend auf Formularvorlage anzuzeigen? –
Ja, das war das Ziel. – neurix
Werfen Sie einen Blick auf diesen generischen Mixin-Ansatz: http://stackoverflow.com/questions/7011773/how-to-create-a-filter-form-for-a-class-based-generic-object- list-in-django –