Форма Django, использующая поля из нескольких моделей
У меня в файле models.py
следующееfrom django.db import models
# Create your models here.
class DPlaces(models.Model):
restaurant = models.CharField(blank=False, unique=True, max_length=50)
def __str__(self):
return self.restaurant
class DEntry(models.Model):
place = models.ForeignKey(DPlaces, on_delete=models.CASCADE)
e4date = models.DateField(blank=False)
У меня в файле forms.py
есть следующееfrom django import forms
from .models import DEntry, DPlaces
class DEntryFilterForm(forms.Form):
place = forms.ModelMultipleChoiceField(
queryset=DPlaces.objects.all(),
widget=forms.SelectMultiple(attrs={'class': 'form-control'}),
required=False,
)
e4date = forms.ModelMultipleChoiceField(
queryset=DEntry.objects.order_by().values_list('e4date', flat=True).distinct(),
widget=forms.SelectMultiple(attrs={'class': 'form-control'}),
required=False,
)
def __init__(self, *args, **kwargs):
super(DEntryFilterForm, self).__init__(*args, **kwargs)
self.fields['place'].queryset = DPlaces.objects.all()
self.fields['e4date'].queryset = DEntry.objects.values_list('e4date', flat=True).distinct()
в моем файле views.py у меня есть
def entrytable_view(request):
data_entries = DEntry.objects.all()
filtered_entries = None
if request.method == 'GET':
form = DEntryFilterForm(request.GET)
if form.is_valid():
# Do Something
Форма работает и form.is_valid возвращает true, если выбран выбор в поле 'place', но не работает и form.is_valid возвращает false, если выбран выбор в поле 'e4date'.
Я подозреваю, что это связано с тем, что поле e4date не находится в модели DPlaces (оно находится в модели DEntry), но я не уверен. В любом случае, я не знаю, как заставить это работать. Любая помощь будет оценена по достоинству.
С помощью form.errors
можно очень легко проверить ошибки формы. Вы можете изменить свою логику, чтобы увидеть фактические ошибки следующим образом:
data_entries = DEntry.objects.all()
filtered_entries = None
if request.method == 'GET':
form = DEntryFilterForm(request.GET)
if form.is_valid():
# Do Something
else:
print(form.errors)