Доступ к пк в шаблонной форме

Я хочу отобразить все элементы формы, включая пк, и я не нашел удовлетворительного метода для этого:

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

и теперь в templatetags у меня есть фильтр get_pk:

@register.filter(name='get_pk')
def get_pk(obj):
    return obj.initial["id"]

и я получаю pk в шаблоне с {{ form|get_pk }} и чувствую, что это не умно. Я пробовал такие вещи, как {{ form.instance.id }}, как предложено здесь . Я все еще чувствую, что должен быть простой способ добиться этого?

Я не знаю, зачем вам нужна форма в представлении шаблона? Вам просто нужно получить контекст, не более... В общем коде есть много комментариев, например:

1-Отключено поле id в начальной форме

2Использование другого имени модели в форме и получение контекстных данных

3-Фильтрация контекста с помощью контекста context["pk"] перед оценкой obj

Найдите пересмотренный код,

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["pk"] = self.request.GET.get("имя поля ввода ")

>

В шаблоне html вы можете получить id напрямую {{obj.id}}

Вернуться на верх