Ich habe ein Formular erstellt, in dem Benutzer einen Datumsbereich eingeben. Einmal gesendet, muss es dann eine Liste von meiner Datenbank von Leuten all jene zurückgeben, deren Geburtstage innerhalb dieses Datumsbereichs sind. Ich bin ziemlich neu in Django und habe es versucht, aber ich verstehe nicht, wie ich mein "start_date & end_date" als Kwargs von meinem Formular an ListView übergeben kann.So zeigen Sie Formularabfrageergebnisse in einem ListView an
views.py:
class BirthdaysRangeFormView(FormView):
template_name = 'snippets/date_selection_form.html'
form_class = datefilterform
def get_form_kwargs(self):
kwargs = super(BirthdaysRangeFormView, self).get_form_kwargs()
kwargs ['request'] = self.request
return kwargs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = "Date Selection"
context['header'] = "Please select date range"
return context
def form_valid(self, form):
self.start_date = (form.cleaned_data['start_date'], People.next_birthday)
self.end_date = (form.cleaned_data['end_date'], People.next_birthday)
return self.redirect_to_results()
def redirect_to_results(self):
self.success_url = "dates:birthdays"
return redirect(
self.get_success_url(),
)
class BirthdaysListView(BirthdaysRangeFormView, ListView):
template_name = 'dates/birthdays.html',
context_object_name = "person"
person = True
# queryset = People.objects.order_by('next_birthday')
def get_queryset(self):
test = ''
forms.py:
class datefilterform(forms.Form):
model = People
start_date = forms.DateField(
input_formats=['%d/%m/%Y'],
widget=DateTimePicker(
options={"format": "DD/MM/YYYY", "pickTime": False})
)
end_date = forms.DateField(
input_formats=['%d/%m/%Y'],
widget=DateTimePicker(
options={"format": "DD/MM/YYYY", "pickTime": False})
)
People.next_birthday = start_date
People.next_birthday = end_date
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super(datefilterform, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'main_form'
self.helper.form_class ='form-horizontal'
self.helper.label_class = 'col-lg-3'
self.helper.field_class = 'col-lg-8'
self.helper.layout = Layout(
'start_date',
'end_date',
FormActions(
Submit('submit', 'Submit'),
Button('cancel', 'Cancel', css_class='cancel')
)
)
def clean(self):
cleaned_data = super().clean()
start_date = cleaned_data.get("start_date")
end_date = cleaned_data.get("end_date")
if not check_end_date(start_date, end_date):
raise forms.ValidationError(
"Incorrect Dates entered, End date must be after start date"
)
Ich habe vor einfache Listviews getan, aber ich verstehe nicht, wie "Bitte" in der Klasse zu verwenden, basierte Ansichten.
Ich verstehe nicht, was du damit meinst, wie es in der def get_queryset oder ein def i verwendet habe zu gehen braucht 'self.request = kwargs.get (‚start_date‘, um zu versuchen, month_start (timezone.now()). Date() .strftime ('% Y-% m-% d') 'self.request = kwargs.get ('end_date', month_end (timezone.now()). date(). strftime ('% Y-% m-% d') ) 'wäre es etwas in dieser Richtung sein –
Sie nächste Ansicht von einer Ansicht aufrufen? Das ist eine schlechte Übung @LewisCollins Ich habe einen Code oben vorbereitet. Es mag hilfreich für dich sein. –
Aus dem obigen Code verstehe ich nicht, wie ich alles in einer Ansicht übergeben könnte –