На прошлой неделе я столкнулся с задачей, связанной с listView и Forms в Django, мне было интересно, как лучше всего (+ Pythonic) реализовать форму поиска внутри ListView после того, как я прочитал 1 и 2 У меня появилась основная идея, поэтому я реализовано первое решение, и я хотел бы получить вашу обратную связь. Цель здесь - выполнить запрос по коду и сохранить запрос, чтобы синхронизировать его с разбиением на страницы.Каков наилучший способ реализации формы запроса в Django ListView?
forms.py
class InscriptionQueryForm(forms.Form):
query_inscription = forms.CharField(label=_('Code'), required=False)
models.py
class Inscription(models.Model):
code = models.CharField(max_length=10, unique=True)
start_on = models.DateField()
finish_on = models.DateField()
active = models.BooleanField(default=False)
views.py
class InscriptionListView(ListView, FormMixin):
model = Inscription
paginate_by = 4
context_object_name = 'inscriptions'
form_class = InscriptionQueryForm
form = None
object_list = None
search = False
def get_queryset(self):
form = self.form_class(self.request.POST)
if form.is_valid() and self.request.method == 'POST':
self.request.session['query_inscription'] = \
form.cleaned_data['query_inscription']
return self.model.objects.filter(
code__icontains=form.cleaned_data['query_inscription']).\
order_by('-active')
if self.request.method == 'GET' and \
'query_inscription' in self.request.session:
return self.model.objects.filter(
code__icontains=self.request.session.get(
'query_inscription', '')).order_by('-active')
return self.model.objects.all().order_by('-active')
def get(self, request, *args, **kwargs):
# From ProcessFormMixin
self.form = self.get_form(self.form_class)
# From BaseListView
if self.request.GET.get('page', False) or self.search:
self.object_list = self.get_queryset()
else:
self.search = False
self.object_list = self.model.objects.all().order_by('-active')
if 'query_inscription' in self.request.session:
del self.request.session['query_inscription']
context = self.get_context_data(
object_list=self.object_list, form=self.form)
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.search = True
return self.get(request, *args, **kwargs)
Что вы думаете г uys ?, я уверен, что есть много других способов.
Почему вы используете сеанс? Разве '' '' query_inscription''' еще не существует в параметрах GET, даже когда вы находитесь между ними? – schillingt
Я отправляю форму по почте, поэтому у меня есть только параметр request_inscription в первый раз. Я сохраняю query_inscription в переменной сеанса, чтобы сохранить правильную разбивку на страницы. Единственным параметром, который я использую get, является «страница». – jorlugaqui