У меня есть форма, которая работает прекрасно
models.py:2 поля из разных моделей в форме
class Location(models.Model):
title = models.CharField(max_length=300)
description = models.TextField(null=True, blank=True)
address = models.TextField(null=True, blank=True)
class Review (models.Model):
location = models.ForeignKey(Location)
description = models.TextField(null=True, blank=True)
views.py:
class Create(CreateView):
model = coremodels.Review
template_name = 'location/test.html'
fields = '__all__'
def form_valid(self, form):
form.save()
return HttpResponseRedirect('')
return super(Create, self).form_valid(form)
HTML:
<form action="" method="post">{% csrf_token %}
{{ form}}
<input type="submit" value="Create" />
</form>
Когда я открываю сайт, я могу выбрать местоположение и дать обзор по кнопке создания. Однако теперь я зависим от предварительно заполненных значений в классе Location. Что делать, если я хочу, чтобы пользователь мог непосредственно создать описание, а также название местоположения (я не хочу, чтобы заголовок был в class Review
). Я уже пробовал искать это в документах, но ничего не мог найти. Где-то я читал, что могу создать две разные формы, которые обрабатывают разные вещи, но я не уверен, как объединить все это в class Create
. Есть ли что-то вроде model = coremodels.Review & coremodels.Location
, а затем в HTML я мог сделать
{{form.title}}
{{form.description}}
Любой любые идеи или условия поиска я мог бы искать?
Спасибо!
EDIT Ok благодаря Ruddra и this post, вот рабочий раствор. Я должен был изменить это немного для того, чтобы он работал на меня,
class SomeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SomeForm, self).__init__(*args, **kwargs)
self.fields['title'] = forms.CharField(label='Title', required = False)
self.fields['description'] = forms.CharField(label='Description', required = False)
self.fields['location'] = forms.ModelChoiceField(queryset= Location.objects.all(), required = False) # This line is for making location not required in form field for input
class Meta:
model = Review
fields = '__all__'
def save(self, commit=True):
"""
It will save location from choice field or inputs of title and description
"""
instance = super(SomeForm, self).save(commit=False)
if instance.location_id:
instance.save()
else:
new_location = Location.objects.create(title=self.cleaned_data['title'])
instance.location = new_location
instance.save()
return instance
и views.py
class Create(CreateView):
model = coremodels.Review
template_name = 'location/test.html'
form_class = SomeForm
Might Полезно: http://stackoverflow.com/questions/2770810/multiple-models-in-a-single-django-modelform –