有没有人知道显示2个选择框的小部件.一个显示模型中所有对象的列表,另一个显示已选择的对象.然后,用户可以从第一个列表中选择一个对象,单击>>按钮将其移动到"选定"列表.然后,当保存表单时,所选列表中的对象将保存在manytomany字段中.
谢谢
我有一个继承自ModelForm的表单:
class ChildModel(ModelForm):
class Meta:
model = Documents
fields = ('secretdocs')
widgets = {
'secretdocs': Select(attrs={'class': 'select'}),
}
Run Code Online (Sandbox Code Playgroud)
模型"secretdocs"有一个uid.但是当它打印出select和option时,选项值显示如下:
<select class="select" id="id_secretdocs" name="secretdocs">
<option value="1">My Secret Doc</option>
</select>
Run Code Online (Sandbox Code Playgroud)
但是我希望它具有选项的uid:
<select class="select" id="id_secretdocs" name="secretdocs">
<option value="cd2feb4a-58cc-49e7-b46e-e2702c8558fd">My Secret Doc</option>
</select>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我试图使用BaseForm的数据对象并覆盖Select的value_from_datadict方法,但我很确定这不是正确的方法.有谁知道我怎么做到这一点?
提前致谢.
我已经为子类提供的表单定义了一个自定义字段和小部件UpdateView。因此,如下所示:
myapp/forms.py:
from .form_fields import MyCustomField
from .widgets import MyCustomWidget
class MyModelForm(forms.ModelForm):
my_field = MyCustomField(queryset=MyModel.objects.all(), widget=MyCustomWidget)
Run Code Online (Sandbox Code Playgroud)
myapp/views.py:
from django.views.generic import UpdateView
from .forms import MyModelForm
class MyView(UpdateView):
form_class = MyModelForm
Run Code Online (Sandbox Code Playgroud)
myapp/widgets.py:
from django.forms import Widget
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
class MyCustomWidget(Widget):
context_data = { 'custom_data': custom_data }
html_output = render_to_string('myapp/widgets/my_custom_widget.html', context_data)
return mark_safe(html_output)
Run Code Online (Sandbox Code Playgroud)
基本上,我希望能够custom_data从我的视图(例如,从会话存储或表单实例)传递到小部件。
我有form.py
SELECT_PRODUCT = [
('item1', 'item1'),
('item2', 'item2'),
('item3', 'item3'),
('item4', 'item4'),
]
class OrderBonus(forms.Form):
select_product = forms.CharField(widget=forms.Select(choices=SELECT_PRODUCT ))
Run Code Online (Sandbox Code Playgroud)
在HTML中,我需要单独渲染每个选项:
<select name="{{ form_bonus.select_product .name }}">
<option value="{{form_bonus.select_product.field.choice.0}}">{{form_bonus.select_product.field.choice.0}}</option>
<option value="{{form_bonus.select_product.field.choice.1}}">{{form_bonus.select_product.field.choice.1}}</option>
<option value="{{form_bonus.select_product.field.choice.2}}">{{form_bonus.select_product.field.choice.2}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我尝试不同的方式:1)form_bonus.select_product.field.choice.0
2)form_bonus.select_product.field.choice.[0]
3)form_bonus.select_product.field.choice.("0")
我尝试迭代:
{% for choice in form_bonus.select_product.field.choices %}
{{ choice }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
要么
{% for value, text in form_bonus.select_product.field.choices %}
{{ value}} - {{ text }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何覆盖Select Widget以使用每个选项:
form_bonus.select_product.field.choice.0ect.
Python 3.5.2和Django 1.10
我正在使用ModelForm并尝试在Django forms.RadioSelect小部件上设置一个css类
class Meta:
model = models.MyModel
fields = ('rating',)
widgets = {
'rating': forms.RadioSelect(attrs={'class':'star'}),
}
Run Code Online (Sandbox Code Playgroud)
但是class ='star'不会在html中呈现.
我也试过用:
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['rating'].widget.attrs['class'] = 'star'
Run Code Online (Sandbox Code Playgroud)
这也没用.我尝试使用forms.Textarea小部件做同样的事情,在那里我能够获得css类.
我在这里做错了什么或者RadioSelect不支持class属性(我希望类名应用于所有无线电输入)?
我正在尝试渲染一个没有数据库模型的简单表单,但出现错误。以下是代码:
from django import forms
from django.utils.safestring import mark_safe
class ContactForm(forms.Form):
category_options = (
('select category', '--Select Category--'),
('fire safety', 'Fire Safety'),
('batteries/solar panels', 'Batteries/Solar Panels'),
( 'cctv systems','CCTV Systems')
)
category = forms.ChoiceField(label="Select a Category", choices=category_options, required=True)
full_name = forms.CharField(required=False)
email = forms.EmailField()
phone = forms.CharField(widget=forms.IntegerField)
message = forms.CharField(widget=forms.Textarea(attrs={'cols': 10, 'rows': 10}))
def clean_email(self):
email = self.cleaned_data.get('email')
return email
Run Code Online (Sandbox Code Playgroud)
我没有正确处理电话字段。我需要添加电话号码验证,但无法找出使用 IntegerField 小部件的正确方法。
我需要找到添加电话字段的准确方法。
我收到错误:
AttributeError at /contact/
'IntegerField' object has no attribute 'is_hidden'
Run Code Online (Sandbox Code Playgroud)
当我使用时我得到以下结果
phone = forms.CharField(widget=forms.NumberInput)
Run Code Online (Sandbox Code Playgroud)
我从不同字段的 python …
我有两个模型,产品和类别以及产品中的多对多字段。类别在 ProductCreate 视图中显示为键。
我需要为类别自定义小部件和字段。
我检查了 Django 源字段和小部件,但没有看到 ManyToMany 的引用(类)。
什么类型的 Field 和 Widget ManyToMany 关系对应(我假设是 Charfield 作为 save 还是 SelectField)?我在哪里可以找到代码?(在这种情况下自定义字段/小部件的示例)
假设你有某个型号
class MyModel(models.Model):
Name = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)
以及您用于创作的随附表格
class CreateMyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name']
Run Code Online (Sandbox Code Playgroud)
在正常情况下,当在模板中呈现表单时,我通常会循环遍历模板中的字段
{%for field in form%}
{{field}}
{%endfor%}
Run Code Online (Sandbox Code Playgroud)
当需要自定义样式时,我通常不得不将我的<div>s 和s 放入该循环中,并在子类中<span>指定基本小部件及其。attrsMeta
浏览有关该主题的Django 文档,我明白似乎我必须使用Media子类才能使所有操作发生在 的widgets属性中Meta,但我就是无法理解它。
假设我有一个模板,其中TextInput需要呈现表单,如下模板所示:
<div class="form-group input-group">
<span class="input-group-addon">Name</span>
<input type="text" name="name" class="form-control" placeholder="MyModel Name">
</div>
Run Code Online (Sandbox Code Playgroud)
我如何创建一个小部件,以便我可以通过使用以下方法获得相同的结果:
class CreateMyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name']
widgets={'name':MyWidget(addon="Name",placeholder="MyModel Name")}
Run Code Online (Sandbox Code Playgroud)
我知道占位符是我可以放入 的attrs …
TimeInput 不适用于下面给出的表单。但 SelectDateWidget() 工作正常。当前 TimeInput() 小部件不会创建错误。
建议使用 TimeInput 小部件的正确方法。
表格.py
class TournmentDetails(forms.ModelForm):
class Meta():
model = Tournament
fields = ('eventname','venue','date','time')
widgets = {
'date': forms.SelectDateWidget(
empty_label=("Choose Year", "Choose Month", "Choose Day"),
),
'time': forms.TimeInput(format='%H:%M'),
}
Run Code Online (Sandbox Code Playgroud)
模型.py
class Tournament(models.Model):
eventname = models.CharField(max_length=30, default="None", choices = EVENT_CHOICES)
venue = models.CharField(max_length=30)
date = models.DateField(max_length=30)
time = models.TimeField(max_length=30)
Run Code Online (Sandbox Code Playgroud) 官方文档解释了如何自动为某些小部件添加资产。,从他们的示例:
from django import forms
class CalendarWidget(forms.TextInput):
class Media:
css = {
'all': ('pretty.css',)
}
js = ('animations.js', 'actions.js')
Run Code Online (Sandbox Code Playgroud)
它没有描述的是如何使 JS 资源延迟或异步加载,例如
<script defer src="https://myserver.com/static/animations.js">/script>
Run Code Online (Sandbox Code Playgroud)
如何添加deferorasync属性?