【问题标题】:access to pk in a template form以模板形式访问 pk
【发布时间】:2022-01-24 20:35:17
【问题描述】:

我想显示一个表单的所有元素,包括 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,我觉得这并不聪明。我尝试了{{ form.instance.id }} 之类的东西,就像建议的here 一样。我仍然觉得必须有一个简单的方法来实现这一点?

【问题讨论】:

  • pk 已经存在于上下文中,你使用它通过context["pk"] 获取对象,使用那个{{ pk }}?
  • 编码不应该累。这是完全正确的。

标签: django django-forms django-templates


【解决方案1】:

我不知道您为什么需要模板视图中的表单?您只需要不再获取上下文.. 共享代码中有很多 cmets,例如:

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 方法在表单内使用输入字段,并通过以下方式在 get context 数据中获取其值: context["pk"] = self.request.GET.get("输入字段名称")

在模板 html 中可以直接显示字段: {{obj.id}},{{obj.name}}, {{obj.data}}

【讨论】:

  • 我实际上按照@Iain Shelvington 的建议做了,但你的也是正确的,他没有发布答案。
猜你喜欢
  • 2019-09-07
  • 2016-10-14
  • 2022-12-04
  • 1970-01-01
  • 2011-08-18
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多