RadioSelect виджет с универсальным UpdateView - PullRequest
1 голос
/ 12 мая 2019

, который обновляется на UpdateView. И я хотел добавить радио выбрать к этому. Все решения, которые я нашел, forms.py, но поскольку я использую UpdateView, я не буду использовать widget в формах. Есть идеи?

views.py

class AddPersonView(LoginRequiredMixin, UserPassesTestMixin, UpdateView)
    model = Trip
    template_name = 'tripplanner/add_new_member.html'
    fields = ["members"]
    success_url = '/'


    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        detailView = self.get_object()
        if self.request.user in detailView.members.all() or self.request.user in detailView.owners.all():
            return True
        return False

.html

{% extends "tripplanner/base.html" %}
{% load crispy_forms_tags %}
{% load i18n %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">{% trans "New member" %}</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">{% trans "Add" %}</button>
            </div>
        </form>
    </div>
{% endblock content %}

1 Ответ

1 голос
/ 12 мая 2019

Все решения, которые я нашел, forms.py, но поскольку я использую UpdateView, я не буду использовать виджет в формах.

Ну, одно не исключает другоесовсем.Фактически, очень часто указывается класс формы в CreateView с и UpdateView с.Даже если вы сами не указали Form, за занавесом ваш UpdateView сконструирует для вас элемент с элементами по умолчанию.Действительно, в классе ModelFormMixin [GitHub] мы видим:

class ModelFormMixin(FormMixin, SingleObjectMixin):

    # ...

    def get_form_class(self):
        # ...
        <b>return model_forms.modelform_factory(model, fields=self.fields)</b>

, поэтому за занавесом он используетmodelform_factory для построения ModelForm для вас с fields, который вы предоставили.Но ничто не мешает вам указать свою собственную форму и использовать эту форму.

В forms.py вы можете указать в своем AddPersonForm, что вы хотите использовать RadioSelect [Django-doc] , хотя, поскольку members, скорее всего, отношение «многие ко многим», CheckboxSelectMultiple [Django-doc] более уместно:

# app/forms.py

from app.models import Trip
from django import forms, <b>RadioSelect</b>

class AddPerson<b>Form</b>(forms.ModelForm):

    class Meta:
        model = Trip
        fields = ['members']
        widgets = {
            <b>'members': RadioSelect()</b>
        }

По вашему мнению, вы можете использовать ваш AddPersonForm:

# app/views.py

from django.views.generic.edit import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from app.models import Trip
from app.forms import <b>AddPersonForm</b>

class AddPersonView(LoginRequiredMixin, UserPassesTestMixin, UpdateView)
    model = Trip
    template_name = 'tripplanner/add_new_member.html'
    <b>form_class = AddPersonForm</b>
    success_url = '/'

    # ...

    def test_func(self):
        detailView = self.get_object()
        user = self.request.user
        return user in detailView.members.all() or user in detailView.owners.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...