Как изменить поле формы с выпадающего списка на радиокнопку в django, если опции в выпадающем списке наследуются от другой модели?

Я работаю над приложением, где я могу выбрать товар из выпадающего списка и купить его. У меня есть поле формы, которое представляет собой выпадающий список (элементы связаны с другой моделью через внешний ключ). Я хочу сделать так, чтобы эти опции отображались как радиокнопки вместо выпадающего списка

my models.py

class Plans(models.Model):
    plan_name = models.CharField(max_length=50)
    speed = models.IntegerField()
    price = models.FloatField()

    def __str__(self):
        return self.plan_name

def get_deadline():
    return dt.today() + timedelta(days=30)


class Orders(models.Model):
    user = models.ForeignKey(CustomUser, primary_key=True, on_delete = models.CASCADE)
    pack = models.ForeignKey(Plans, on_delete = models.CASCADE)
    start_date = models.DateField(auto_now_add=True)
    end_date = models.DateField(default=get_deadline())
    is_active = models.BooleanField(default=True)

    def __str__(self):
        name = str(self.user.username)
        return name

    def get_absolute_url(self):
        return reverse('home-home')

my forms.py (я пытался использовать метод init, но мой выпадающий список исчезает, когда я использую его)

class BuyPlanForm(forms.ModelForm):
    error_css_class = 'error-field'
    required_css_class = 'required-field'

    class Meta():
        model = Orders
        fields = ['pack']
        

    #def __init__(self, *args, **kwargs):
     #   super(BuyPlanForm, self).__init__(*args, **kwargs)
      #  for field in self.fields.values():
       #     if isinstance(field.widget, forms.Select):
         #       field.widget = forms.RadioSelect()

my views.py

class UserBuyPlan(LoginRequiredMixin, CreateView):
    template_name = 'plans/plan.html'
    form_class = BuyPlanForm

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

пожалуйста, помогите. (извините, я старался изо всех сил объяснить проблему, но мой английский не очень хорош) enter image description here

Вы можете попробовать сделать что-то подобное в своем шаблоне:

{% for plan in order.plan_set.all %}
            <input type="radio" name="plan" id="choice{{ forloop.counter }}" value="{{ plan.id }}">
            <label for="plan{{ forloop.counter }}">{{ plan.choice_text }}</label><br>
        {% endfor %}

Для получения дополнительной информации проверьте https://docs.djangoproject.com/en/4.0/intro/tutorial01/, я модифицировал этот код оттуда

Попробуйте сделать это в вашей форме:

class BuyPlanForm(forms.Form):
    
    park = forms.MultipleChoiceField(
          widget=forms.CheckboxSelectMultiple,
          choices = Orders.pack,
          label = 'pack'
         )

Удалите forms.ModelForm и замените его на forms.Form. и управляйте добавлением в вашем представлении.

Сообщите мне, если это работает. Спасибо

поэтому мне пришлось просто добавить виджет в поле формы >>> pack = forms.ModelChoiceField(Plans.objects.all(), widget=forms.RadioSelect())

Итак, мой класс полной формы выглядит так

class BuyPlanForm(forms.ModelForm):
    error_css_class = 'error-field'
    required_css_class = 'required-field'
    pack = forms.ModelChoiceField(Plans.objects.all(), widget=forms.RadioSelect())

    class Meta():
        model = Orders
        fields = ['pack']

Вернуться на верх