我需要一个小部件,它应该只显示一个块,因为我将使用jQuery添加功能.我试图通过Widget的"媒体"类包含javascript和样式表,它对我不起作用.
这是代码:
class StarsWidget(Widget):
"""
Widget with stars for rating
"""
class Media:
js = (
settings.MEDIA_URL + 'js/rating.js',
)
css = {
'screen': (
settings.MEDIA_URL + 'css/rating.css',
)
}
def render(self, name, value, attrs=None):
if value is None: value = ''
attrs = {'id':'ratingX', 'class':'rating'}
final_attrs = self.build_attrs(attrs, name=name)
if value != '':
# Only add the 'value' attribute if a value is non-empty.
final_attrs['value'] = force_unicode(value)
return mark_safe(u'<div %s ></div>' % flatatt(final_attrs))
Run Code Online (Sandbox Code Playgroud)
任何建议或帮助将不胜感激
我有一个带有charfield和choicefield的多值场.我需要选择传递给choicefield构造,但是当我尝试将其传递到我的自定义multivaluefield我得到一个错误__init__()得到了一个意想不到的关键字参数"选择".
我知道其余的代码是有效的,因为当我从__init__super和super中删除choices关键字参数时,多值字段正确显示但没有任何选择.
这就是我设置自定义多值字段的方法:
class InputAndChoice(object):
def __init__(self, text_val='', choice_val=''):
self.text_val=text_val
self.choice_val=choice_val
class InputAndChoiceWidget(widgets.MultiWidget):
def __init__(self, attrs=None):
widget = (widgets.TextInput(),
widgets.Select()
)
super(InputAndChoiceWidget, self).__init__(widget, attrs=attrs)
def decompress(self,value):
if value:
return [value.text_val, value.choice_val]
return [None, None]
class InputAndChoiceField(forms.MultiValueField):
widget = InputAndChoiceWidget
def __init__(self, required=True, widget=None, label=None, initial=None,
help_text=None, choices=None):
field = (
fields.CharField(),
fields.ChoiceField(choices=choices),
)
super(InputAndChoiceField, self).__init__(fields=field, widget=widget,
label=label, initial=initial, help_text=help_text, choices=choices)
Run Code Online (Sandbox Code Playgroud)
我称之为:
input_and_choice = InputAndChoiceField(choices=[(1,'first'),(2,'second')])
Run Code Online (Sandbox Code Playgroud)
那么如何将选择传递给我的ChoiceField字段呢?
编辑:
我试过stefanw的建议,但仍然没有运气.我已经使用logging.debug在init的末尾打印出InputAndChoiceField的内容,self.fields [1] .choices包含正确的值,但是它没有在浏览器中显示任何选项.
当字段为readonly时,我想在django admin的字段上显示我的小部件.
admin.py
class AudioTrackAdminInline(admin.StackedInline):
model = AudioTrack
form = AudioTrackForm
readonly_fields = ('file',)
Run Code Online (Sandbox Code Playgroud)
forms.py
class AudioTrackForm(forms.ModelForm):
class Meta:
model = AudioTrack
widgets = { 'file': MediaFileInput, } # my widget
Run Code Online (Sandbox Code Playgroud)
当文件不是只读时,它会显示小部件确定.但当我把它作为readonly包含时,我看到文本行.(如果只读,Django不会使用我的表格)
即使在只读字段,我如何才能使用它?
要么
如果我只设置我的字段,如何显示另一个小部件?
我有ModelForm使用ManyToManyField的django 模型.我想将此字段的小部件更改为CheckboxSelectMultiple.我可以在不覆盖表单定义中的字段的情况下执行此操作吗?
我经常使用类似这样的代码:
class MyModel(ModelForm):
m2m_field = forms.ModelMultipleChoiceField(queryset = SomeModel.objects.all(),
widget = forms.CheckboxSelectMultiple())
Run Code Online (Sandbox Code Playgroud)
还有其他办法吗?
编辑:我需要这个Django 1.1.1项目
我想创建小部件,当关联字段有错误时,将特定类添加到元素标记.
我很难从小部件定义代码中查找有关如何检查字段是否存在与之关联的错误的信息.
目前我有以下存根窗口小部件代码(最终窗口小部件将使用更复杂的标记).
from django import forms
from django.utils.safestring import mark_safe
class CustomTextWidget(forms.Widget):
def render(self, name, value, attrs):
field_has_errors=False # change to dynamically reflect field errors, somehow
if field_has_errors:
error_class_string="error"
else:
error_class_string=""
return mark_safe(
"<input type=\"text\" class=\"%s\" value=\"%s\" id=\"id_%s\" name=\"%s\">" % (error_class_string, value, name, name)
)
Run Code Online (Sandbox Code Playgroud)
任何人都可以阐明在这里填充field_has_errors布尔的合理方法吗?(或者可能建议一种更好的方法来完成我正在尝试做的事情).提前致谢.
我知道如果我需要为django-admin中的字段定制"选择器",我需要创建一个自定义小部件.但是,如果小部件必须生成两个值,例如X和Y坐标,如何将它们填充到模型的两个不同字段中呢?
是否有一个不同的小部件或参数允许django仅显示/采用年和月输入而不是年,月和日?
目前正在使用SelectDateWidget.
创建接受浮点数并具有与 NumberInput 相同功能的 django 表单字段的最佳方法是什么?我的意思是使用相同的功能是 django 的 NumberInput 在输入旁边有箭头,可以增加或减少数字,它也接受 min_value 和 max_value。如果我使用 TextInput 小部件,我将无法获得此功能。如果我使用 NumberInput 小部件,它将不适用于浮点数:
homework = forms.FloatField(required=False, max_value=10, min_value=0, widget=NumberInput(attrs={'id': 'form_homework'}))
Run Code Online (Sandbox Code Playgroud)

当我单击 + - 按钮时,它不包括浮点数(即 5.5)。此外,如果我想将实际浮点数(作业成绩)设置为初始值(使用 Jquery),它根本不显示浮点数。
欢迎任何建议。
编辑:
如果我做:
class NumberInput(TextInput):
input_type = 'number'
homework = forms.FloatField(required=False, max_value=10, min_value=0,
widget=NumberInput(attrs={'id': 'form_homework', 'step': '0.1'}))
Run Code Online (Sandbox Code Playgroud)
'step' 属性有效,但 max_value/min_value 无效。如果我不以这种方式定义 NumberInput 并使用常规的 NumberInput,则它根本不起作用。
注意:这个问题不应该与之前类似但在Django 1.11发布基于模板的表单呈现之前相似的问题混淆.
我知道Django现在有基于模板的表单渲染.据我所知,这应该解决了必须从视图或表单中注入CSS类的问题,而不是将所有HTML/CSS保留在模板中.
这是我的目标:让我的表单和视图集中在什么显示,并专注于我的模板是如何被显示.所以我想在我的模板中保留所有HTML/CSS.
所以,我的问题是:
form-text所有TextInput小部件添加类(例如)?alert-warning从模板系统向所有错误消息(验证失败)添加类(例如)?我可能误解了这个新功能的一些内容,所以如果我这样做了,请随时告诉我这是不是它的工作原理,或者我是在问这个不可能的事情.理想情况下,我想实现这些表单渲染更改到主模板.
views.py:
class SignUp(generic.edit.CreateView):
model = models.User
template_name = 'usermgmt/sign_up.html'
form_class = forms.UserCreateForm
success_url = '/sign_up_done/'
Run Code Online (Sandbox Code Playgroud)
templates/master.html(我想在这里添加一些导致所有TextInput小部件获得类的东西):
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
<title>{% block title %}{% endblock %} | Website</title>
</head>
<body>
<div class="content-wrapper clearfix">
{% block main %}{% endblock %}
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
templates/usermgmt/sign_up.html:
{% extends 'master.html' %}
{% block title %}Sign Up{% endblock …Run Code Online (Sandbox Code Playgroud) django ×10
django-widget ×10
django-forms ×5
django-admin ×2
python ×2
css ×1
forms ×1
imagefield ×1
many-to-many ×1