Django - Как отобразить форму в модальном окне?
На странице подробностей конкретного объекта (в моем случае, 'TrimType) я хочу отображать форму создания при нажатии кнопки 'Create', и форму обновления при нажатии кнопки 'Update' в одном модальном окне.
Нужно ли несколько url/view для модального окна, которое отображает форму Create
или Update
? Или это возможно в одном url/view?
Я реализовал его в одном url/view, create работает хорошо, но он не работает как функция обновления.
Как реализовать views.py
?
- models.py:
class Car(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200, null=False, blank=False)
class TrimType(models.Model):
car = models.ForeignKey(Car, on_delete=models.SET_NULL, blank=True, null=True,)
typeName = models.CharField(max_length=50, blank=False, null=False)
- forms.py:
class TrimTypeForm(forms.ModelForm):
class Meta:
model = TrimType
fields = ('car', 'typeName')
typeName = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
- detail_view.html:
<div class="text-right mt-3 mb-3">
<a href="" id="btn_trimtype_add" class="btn btn-primary btn-icon waves-effect waves-themed" data-toggle="modal" data-target="#exampleModal" data-whatever="@mdo" title="">add</a>
<a href="" id="btn_trimtype_modify" class="btn btn-info btn-icon waves-effect waves-themed" data-toggle="modal" data-target="#exampleModal" data-whatever="@mdo" title="">modify</a>
</div>
{% include 'modal_form.html' %}
- modal_form.html:
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-body">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h3 class="modal-title">TrimType</h3>
<form method="post" class="form-horizontal" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.errors }}</p>
<input type="hidden" name="car" value="{{ carID }}">
<div class="form-group">
<label class="form-label" for="id_typeName">TrimType <span class="text-danger">*</span></label>
<div class="col-sm-8">
<input type="text" name="typeName" maxlength="50" required id="id_typeName">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button class="btn btn-primary col-xs-12" name="form" type="submit">Save</button>
</div>
</form>
</div>
</div>
</div>
</div>
- views.py:
class DetailView(FormView):
model = TrimType
form_class = TrimTypeForm
template_name = 'car/detail.html'
def get_success_url(self):
car_id = int(self.kwargs.get('car_id', 0))
trimType_id = int(self.request.GET.get('trimType', 0))
self.get_success_url = reverse_lazy('brand:detail', kwargs={'car_id': car_id})
return self.get_success_url
def dispatch(self, request, *args, **kwargs):
return super(DetailView, self).dispatch(request, *args, **kwargs)
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.save()
return HttpResponseRedirect(self.get_success_url())
def get_context_data(self, **kwargs):
car_id = int(self.kwargs.get('car_id', 0))
trimType_id = int(self.request.GET.get('trimType', 0))
car = Car.objects.get(id=self.kwargs.get('car_id', 0))
trimType = ''
trimType_list = TrimType.objects.filter(car__id=car_id).order_by('-id')
if trimType_id != 0:
trimType = TrimType.objects.get(id=trimType_id)
context = super(CarDetailView, self).get_context_data(**kwargs)
context['carID'] = car_id
context['trimTypeID'] = trimType_id
context['trimType'] = trimType
context['trimType_list'] = trimType_list
return context