簡體   English   中英

如果下拉列表中的選項是從另一個 model 繼承的,如何將表單字段從下拉列表更改為單選按鈕 django?

[英]how to change form field from dropdown list to radio button in django if the options in dropdown are being inherited from another model?

我正在開發一個應用程序,我可以從下拉列表中選擇 select 項目並購買它們。 我有一個表單字段,它是一個下拉列表(項目通過外鍵連接到其他 model。我想讓這些選項顯示為單選按鈕而不是下拉列表

我的模型.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')

我的 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()

我的觀點.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 看起來像

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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM