的Django 1.9.7
class PlaceName(models.Model):
one = ForeignKey(Place, on_delete=models.CASCADE)
...
class PlaceNameCreate(CreateView):
model = PlaceName
fields = ['one', 'name', 'since', ]
@register.filter
def disable_one(value):
"""
Disable selection of "one" field in case of one-to-many relations.
"""
value = value.replace('name="one"', 'name="one" disabled')
value = mark_safe(value)
return value
<form method="post" action="">
{% csrf_token %}
<table>
{{ form.as_table|disable_one }}
</table>
<input type="submit" value="Сохранить"/>
</form>
该PlaceName是下级参考书,主要是Place。我从PlaceView(DetailView)调用PlaceNameCreate,传输一个带符号的Place值,并且不希望用户更改它。
好吧,这是行不通的。在此ForeignKey的页面上,显示消息“此字段为必填”。
如果我从模板中删除disable_one过滤器,则一切正常:成功保存模型实例。
如果我挖到FormMixin并在方法get_form中可以看到
dict: {'instance': None, 'data': <QueryDict: {'since': ['2'], 'csrfmiddlewaretoken': ['6NPIva2Z7XEZzuG2xgWB3sAz0N1SPqZc'], 'name': ['2']}>, 'files': <MultiValueDict: {}>, 'prefix': None, 'initial': {}}
这意味着一个字段为空。表格无效也就不足为奇了。
没有过滤器:
dict: {'instance': None, 'data': <QueryDict: {'one': ['3'], 'since': ['3'], 'csrfmiddlewaretoken': ['6NPIva2Z7XEZzuG2xgWB3sAz0N1SPqZc'], 'name': ['2']}>, 'files': <MultiValueDict: {}>, 'prefix': None, 'initial': {}}
我检查了呈现的html。唯一的区别-如预期的-是属性“禁用”。
任何变体都是可以接受的,我使用过滤器的方式不是教条。我只是认为这是最简单的一种。
您能否提示我如何实现当前的目标:向用户显示值保留,而其他变体的选择是不可能的。
稍后添加:
我按照建议尝试了只读。不工作 这是呈现的html。
<!DOCTYPE html>
...
<select id="id_one" name="one" readonly>
<option value="">---------</option>
<option value="3" selected="selected">664011</option>
</select>
嗯,在浏览器中,用户仍然可以在两个值(“ ---------”和“ 664011”)之间进行选择。
再次添加
该问题被认为是重复的。但这不是。这是一个纯Django问题。为我建议的解决方案是这样的:disable元素,但将值保留在隐藏的输入中。然后使用JQuery。这不是我想要的。
可能的解决方案
我只是决定剥夺用户的任何其他选择。如果没有更好的解决方案,这是可以接受的。
def get_form(self, form_class):
form = super(PlaceNameCreate, self).get_form(form_class)
one = self.initial.get('one')
choices = ((one.id, one),)
form.fields['one'].widget = forms.Select(choices=choices)
return form
def get_form(self, form_class):
"""
For one-to-many relationships.
Deprive user of any choice.
"""
form = super(CreateSubordinate, self).get_form(form_class)
one = self.initial.get('one')
if one:
choices = ((one.id, one),)
form.fields['one'].widget = forms.Select(choices=choices)
return form
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句