Доступ к пк в шаблонной форме
Я хочу отобразить все элементы формы, включая пк, и я не нашел удовлетворительного метода для этого:
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}}