Как определит RadioSelect для ModelForm в Django?

151
20 января 2020, 20:50

Я создаю приложение для сбора обратной связи от пользователей на django. Вопрос заключается в том, как связать модель с html-формой, используя django widgets и ModelForm?

Моя модель: models.py

class Feedback(models.Model):
    user_name = models.CharField(max_length=50)
    rate = models.IntegerField()

views.py

from django.shortcuts import render
from django.views import View
from .forms import FeedbackForm
class Survey(View):
    def get(self, request):
        form = FeedbackForm()
        return render(request, 'form/index.html', context={'form': form)

Форма django: forms.py

from django import forms
from .models import Feedback

class FeedbackForm(forms.ModelForm):
    class Meta:
        model = Feedback
        fields = ['rate']
        widgets = {
            'rate': forms.RadioSelect(attrs={'name': 'rating'}}

Часть html-формы: index.html

<h1 class="form-header">Насколько вероятно Вы порекомендуете инструмент?</h1>
        <div class="rating-wrapper">
            <label class="radio-container">1
                <input type="radio" name="rating" value="1">
                <span class="radio-checkmark"></span>
            </label>
            <label class="radio-container">2
                <input type="radio" name="rating" value="2">
                <span class="radio-checkmark"></span>
            </label>
            <label class="radio-container">3
                <input type="radio" name="rating" value="3">
                <span class="radio-checkmark"></span>
            </label>
       </div>

Каким образом я могу определить атрибуты для виджета, чтобы генерировался такой же html-шаблон? И соответственно, каким образом я могу итерироваться по полю rate в html-шаблоне, чтобы генерировалось, например, 10 радиокнопок? Т.е., получается что при выборе определенной радиокнопки её значение должно записываться в поле rate модели Feedback.

Буду благодарен за любую помощь. Заранее спасибо!

Answer 1

Для того, чтобы можно было итерироваться по полю rate надо добавить атрибут choices в конструктор класса RadioSelect и определить возможные варианты выбора, т.е. форма будут выглядеть следующим образом:

from django import forms
from .models import Feedback

class FeedbackForm(forms.ModelForm):
    class Meta:
        model = Feedback
        fields = ['rate']
        choices = ((1, 1), (2, 2),)
        widgets = {'rate': forms.RadioSelect(attrs={'name': 'rating'}, choices=choices)}

В html-шаблоне:

<h1 class="form-header">Насколько вероятно Вы порекомендуете инструмент </h1>
    <div class="rating-wrapper">
        {% for radio in form.rate %}
          <label for="{{ radio.id_for_label }}" class="rating-wrapper">
            {{ radio.choice_label }}
            {{ radio.tag }}
            <span class="radio-checkmark"></span>
          </label>
        {% endfor %}
   </div>
READ ALSO
position absolute и скролл родителя

position absolute и скролл родителя

Доброго всем времени суток, столкнулся с неожиданной для себя проблемой, хотелось бы понять причины такого поведения

107
Скопировать страницу

Скопировать страницу

Прошу прощения сразу, вопрос наверно банальный, но к сожалению не для меняЕсть сайт на ворпресе

145
Влияние контена элемента на flex-grow

Влияние контена элемента на flex-grow

Как сделать, чтобы при такой верстке, контент (во втором примере) не влиял на ширину элементов и при этом сохранялась "резиновость"

169
Bootstrap 4 выровнять кнопку вертикально?

Bootstrap 4 выровнять кнопку вертикально?

Как в Bootrstrap 4 выровнять вертикально по центру кнопку внутриcol?

118