gpt4 book ai didi

Django RadioSelect 小部件,添加附加信息

转载 作者:行者123 更新时间:2023-12-04 15:20:42 25 4
gpt4 key购买 nike

我有这个简化的模型和形式:

class Books(models.Model):
name = models.CharField(max_length=500)
price = models.DecimalField(max_digits=6, decimal_places=2)
default = models.BooleanField(default=False)

def __str__(self):
return self.name



class BookForm(forms.Form):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.fields['Field'] = forms.ModelChoiceField(queryset=None, empty_label=None, widget=forms.RadioSelect)
self.fields['Field'].queryset = Books.objects.all()
self.fields['Field'].initial = Books.objects.filter(default=True).first()

这将产生一个 RadioSelect-Form,如下所示:

(x) Book1
( ) Book2
( ) Book3

我的问题是,如何在 RadioSelect 表单中添加价格,它只是可见的。它应该出现在书名之后,最好是使用不同的字体,我在 Bootstrap 类(例如“text-primary”)上设置了它(这不是强制性的)

(x) Book1 (10 €)
( ) Book2 (20 €)
( ) Book3 (30 €)

我知道我可以返回模型中的名称和价格,比如

class Books(models.Model):
name = models.CharField(max_length=500)
price = models.DecimalField(max_digits=6, decimal_places=2)
default = models.BooleanField(default=False)

def __str__(self):
return '%s (%s €)' % (self.value, str(self.price))

但由于其他原因,我不能这样做。我只需要返回名称。还有其他方法吗?

我什至阅读了 django-crispy-forms,但找不到解决方案。

最佳答案

您可以使用.label_from_instance

来自documentation :

The __str__() method of the model will be called to generate string representations of the objects for use in the field’s choices. To provide customized representations, subclass ModelChoiceField and override label_from_instance.

您可以定义一个函数来为您提供所需的表示,然后在您的字段上设置 .label_from_instance

你的 BookForm 看起来像这样:

class BookForm(forms.Form):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.fields['Field'] = forms.ModelChoiceField(queryset=None, empty_label=None, widget=forms.RadioSelect)
self.fields['Field'].queryset = Books.objects.all()
self.fields['Field'].initial = Books.objects.filter(default=True).first()
# customize how your option is rendered in the template
self.fields["Field"].label_from_instance = lambda item: f"{item} ({item.price} €)"

要在标签上应用 CSS,请添加 HTML。除了使用 style='...',您还可以使用类,以便它与 Bootstrap 一起工作。

self.fields["Field"].label_from_instance = lambda item: f"{item} <span style='color:red;'>({item.price} €)</span>"

对于 3.7 之前的 Python 版本:

self.fields["Field"].label_from_instance = lambda item: str(item) + "<span style='color:red;'>(" + str(item.price) + " €)</span>"

然后像这样在模板中呈现您的表单:

<form action="{% url 'books' %}" method="post">
{% csrf_token %}
{% for hidden_field in form.hidden_fields %}
{{ hidden_field }}
{% endfor %}
<ul>
{% for choice in form.Field %}
<li>{{ choice.choice_label|safe }}</li>
{% endfor %}
</ul>
<input class="btn btn-dark" type="submit" value="Submit">
</form>

遍历您的领域的选择,然后您可以获得您的自定义标签:

{{ choice.choice_label|safe }}

safe需要过滤器,这样您的 HTML 就不会被转义。

关于Django RadioSelect 小部件,添加附加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63375457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com