Как изменить поле формы с выпадающего списка на радиокнопку в 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)
пожалуйста, помогите. (извините, я старался изо всех сил объяснить проблему, но мой английский не очень хорош) 
Вы можете попробовать сделать что-то подобное в своем шаблоне:
{% 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']