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">&times;</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
Вернуться на верх