以模板形式访问 pk
access to pk in a template form
我想显示一个表单的所有元素,包括 pk,但我还没有找到令人满意的方法:
class SomeForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["number"] = forms.IntegerField(required = True)
self.fields["id"] = forms.IntegerField(disabled = True)
self.fields["data"] = forms.CharField(required = False)
class Meta:
model = SomeModel
fields = ["id", "number", "data"]
所以现在我只需调用视图中的表单:
class SomeView(TemplateView):
template_name = "app/sometemplate.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
obj = MODEL.objects.get(pk = context["pk"])
MODEL_data = {}
MODEL_data["number"] = obj.number
MODEL_data["id"] = obj.pk
MODEL_data["data"] = obj.data
context["form"] = SomeForm(initial = MODEL_data)
return context
现在在模板标签中我有一个过滤器 get_pk
:
@register.filter(name='get_pk')
def get_pk(obj):
return obj.initial["id"]
我在模板中用 {{ form|get_pk }}
得到了 pk
,我觉得这不聪明。我按照建议 here 尝试了 {{ form.instance.id }}
之类的东西。我仍然觉得必须有一个简单的方法来实现这一点?
不知道为什么模板视图中需要表单?您只需要不再获取上下文..
共享代码中有很多评论,例如:
1-禁用初始形式的 id 字段
2-在表单中使用不同的模型名称并获取上下文数据
3-在评估 obj
之前使用 context["pk"] 过滤上下文
找到修改后的代码,
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["obj"] = SomeModel.objects.get(pk = the desired value)
return context
注意:如果您希望用户插入 pk,那么您可以使用带有 get 方法的表单内的输入字段,并通过以下方式在获取上下文数据中获取其值:
context["pk"] = self.request.GET.get("输入字段名称")
在模板中 html 您可以直接显示字段:
{{obj.id}},{{obj.name}}, {{obj.data}}
我想显示一个表单的所有元素,包括 pk,但我还没有找到令人满意的方法:
class SomeForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["number"] = forms.IntegerField(required = True)
self.fields["id"] = forms.IntegerField(disabled = True)
self.fields["data"] = forms.CharField(required = False)
class Meta:
model = SomeModel
fields = ["id", "number", "data"]
所以现在我只需调用视图中的表单:
class SomeView(TemplateView):
template_name = "app/sometemplate.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
obj = MODEL.objects.get(pk = context["pk"])
MODEL_data = {}
MODEL_data["number"] = obj.number
MODEL_data["id"] = obj.pk
MODEL_data["data"] = obj.data
context["form"] = SomeForm(initial = MODEL_data)
return context
现在在模板标签中我有一个过滤器 get_pk
:
@register.filter(name='get_pk')
def get_pk(obj):
return obj.initial["id"]
我在模板中用 {{ form|get_pk }}
得到了 pk
,我觉得这不聪明。我按照建议 here 尝试了 {{ form.instance.id }}
之类的东西。我仍然觉得必须有一个简单的方法来实现这一点?
不知道为什么模板视图中需要表单?您只需要不再获取上下文.. 共享代码中有很多评论,例如:
1-禁用初始形式的 id 字段
2-在表单中使用不同的模型名称并获取上下文数据
3-在评估 obj
之前使用 context["pk"] 过滤上下文找到修改后的代码,
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["obj"] = SomeModel.objects.get(pk = the desired value)
return context
注意:如果您希望用户插入 pk,那么您可以使用带有 get 方法的表单内的输入字段,并通过以下方式在获取上下文数据中获取其值: context["pk"] = self.request.GET.get("输入字段名称")
在模板中 html 您可以直接显示字段: {{obj.id}},{{obj.name}}, {{obj.data}}