Sto cercando di realizzare un Class Based ListView
che visualizza una selezione di un set di tabella. Se il sito viene richiesto per la prima volta, dovrebbe essere visualizzato il set di dati. Preferirei un invio POST, ma anche GET va bene.Django: modulo di ricerca in ListView basato su classi
Questo è un problema, che è stato facile da gestire con function based views
, tuttavia con le visualizzazioni basate sulla classe ho difficoltà a capirlo.
Il mio problema è che ottengo un numero diverso di errori, causati dalla mia comprensione limitata delle viste basate su classi. Ho letto varie documentazioni e ho compreso le visualizzazioni per richieste di query dirette, ma non appena desidero aggiungere un modulo all'istruzione della query, mi imbatto in un errore diverso. Per il codice qui sotto, ricevo un ValueError: Cannot use None as a query value
.
Quale sarebbe il flusso di lavoro delle best practice per un ListView basato su classi in base alle voci del modulo (altrimenti selezionando l'intero database)?
Questo è il mio codice di esempio:
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
class ProfileList(ListView):
model = Profile
form_class = ProfileSearchForm
context_object_name = 'profiles'
template_name = 'pages/profile/list_profiles.html'
profiles = []
def post(self, request, *args, **kwargs):
self.show_results = False
self.object_list = self.get_queryset()
form = form_class(self.request.POST or None)
if form.is_valid():
self.show_results = True
self.profiles = Profile.objects.filter(name__icontains=form.cleaned_data['name'])
else:
self.profiles = Profile.objects.all()
return self.render_to_response(self.get_context_data(object_list=self.object_list, form=form))
def get_context_data(self, **kwargs):
context = super(ProfileList, self).get_context_data(**kwargs)
if not self.profiles:
self.profiles = Profile.objects.all()
context.update({
'profiles': self.profiles
})
return context
Di seguito ho aggiunto l'FBV che esegue il lavoro. Come posso convertire questa funzionalità in CBV? Sembra essere così semplice nelle viste basate sulla funzione, ma non nelle viste basate sulla classe.
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))
Domanda, stai tentando di visualizzare un valore da un set di query basato sull'invio del modulo? –
sì, quello era l'obiettivo. – neurix
Dai un'occhiata a questo approccio generico di mixin: http://stackoverflow.com/questions/7011773/how-to-create-a-filter-form-for-a-class-based-generic-object- list-in-django –