如何解决Django“ .widget.attrs.update”没有效果
我有一个具有以下初始化方法的ModelForm:
def __init__(self,*args,**kwargs):
super(FragebogenForm,self).__init__(*args,**kwargs)
self.fields['birth_date'].widget.attrs.update({'type': 'date'})
这不会更改输入标签的type属性,尽管它应该according to the documentation(Ctrl + f->“或者如果未在表单上直接声明该字段”)。如果我将其更改为例如.widget.attrs.update({'placeholder': '12.12.1999'})
有效,新的占位符将出现在页面上。仅将类型设置为日期不起作用,但是为什么呢?
解决方法
窗口小部件的类型由from itertools import product
from z3 import *
import networkx as nx
GraphSort = Datatype('GraphSort')
GraphSort.declare('Graph',('V',ArraySort(IntSort(),BoolSort())),('E',BoolSort()))),)
GraphSort = GraphSort.create()
V = GraphSort.V
E = GraphSort.E
class Graph(DatatypeRef):
def __new__(cls,name):
# Hijack z3 DatatypeRef instance
inst = Const(name,GraphSort)
inst.__class__ = Graph
return inst
def __init__(G,name):
G.axioms = []
n,m = Ints('n m')
G.add(ForAll(
[n,m],Implies(E(G)[n][m],And(V(G)[n],V(G)[m]))
))
def add(G,*v):
G.axioms.extend(v)
def add_networkx(G,nx_graph):
g = nx.convert_node_labels_to_integers(nx_graph)
Vs = g.number_of_nodes()
Es = g.number_of_edges()
n = Int('n')
G.add(ForAll(n,V(G)[n] == And(0 <= n,n < Vs)))
G.add(*[E(G)[i][k] for i,k in g.edges()])
G.add(Sum([
If(E(G)[i][k],1,0) for i,k in product(range(Vs),range(Vs))
]) == Es)
def assert_into(G,solver):
for ax in G.axioms:
solver.add(ax)
s = Solver()
G = Graph('G')
G.add_networkx(nx.petersen_graph())
G.assert_into(s)
属性确定,因此:
.input_type
然而,这通常不是一个好主意,因为该窗口小部件的其他项随后未正确更改。通常,您在def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields['birth_date'].widget.input_type = 'date'
类中指定小部件:
Meta
但是,如果小部件不是class MyForm(forms.ModelForm):
class Meta:
model = Meta
widgets = {
'birth_date': forms.DateInput()
}
,则模型中的字段DateInput
可能不是birth_date
,因此最好修复 this 而不是在小部件级别解决它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。