以模板形式访问 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}}