Crispy_forms.exceptions.CrispyError: |as_crispy_field было передано недопустимое или несуществующее поле - models.ForeignKey
Я пытаюсь создать внешнюю страницу ввода данных для существующей модели. Однако при нажатии на ссылку я получаю ошибку:
crispy_forms.exceptions.CrispyError: |as_crispy_field got passed an invalid or inexistent field
Для ясности, добавление данных из Django Admin работает без проблем.
Просматривая ряд вопросов, на которые здесь отвечали, один из них подчеркнул то, что, по моему мнению, может быть проблемой, но он был вырван из контекста и не давал особого объяснения.
Я пытаюсь создать внешнюю форму входа для пользователей, которая соответствует внешнему ключу.
models.py
class NewHandoff(models.Model):
handoff_pk = models.AutoField(primary_key=True)
handoff_date = models.DateField(auto_now_add=True,verbose_name="Handoff Date")
shift1_pri = models.ForeignKey(Engineer,on_delete=models.CASCADE,verbose_name="Shift 1 Primary")
shift1_sec = models.ForeignKey(Engineer,on_delete=models.CASCADE,verbose_name="Shift 1 Secondary")
def __str__(self):
return f"{self.handoff_date}"
class Meta:
verbose_name_plural = 'Handoffs'
# New Handoff Form
class NewHandoffForm(forms.ModelForm):
class Meta:
model = NewHandoff
fields = ['shift1_pri','shift1_sec']
views.py
from django.shortcuts import redirect, render
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http.response import HttpResponse
from django.contrib import messages
from .models import AttentionForm, NewHandoffForm
# Handoff View Page
class NewHandoffView(LoginRequiredMixin,View):
def get(self, request):
greeting = {}
greeting['heading'] = "New Handoff"
greeting['pageview'] = "Handoff"
return render (request,'handoff/handoff-new.html')
def post(self, request):
if request.method == "POST":
if "add-new-handoff-button" in request.POST:
create_new_handoff_form = NewHandoffForm(request.POST)
create_new_handoff_form.save()
return redirect("/handoff/handoff-create")
handoff-new.html
{% extends 'partials/base.html' %}
{% load static %}
{% load humanize %}
{% load crispy_forms_tags %}
{% block extra_css %}
<link href="{% static 'libs/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css' %}" rel="stylesheet">
{% endblock %}
{% block contents %}
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<!-- New Form -->
<form method="POST">
{% csrf_token %}
<div class="row">
<div class="row-fluid pb-1">
<!-- Field 1 -->
<div class="mb-3">
{{ form.shift1_pri|as_crispy_field }}
</div>
<!-- End of Field 1 -->
</div>
</div>
<div class="d-flex flex-wrap gap-2">
<button type="submit" class="btn btn-primary waves-effect waves-light" name="add-new-handoff-button">Create New Handoff</button>
</div>
</form>
<!-- End of New Form -->
</div>
</div>
</div>
</div>
{% endblock %}
{% block extra_javascript %}
{% endblock %}
Кто-то упомянул в другом сообщении, что формы должны соотноситься с объявленным именем формы {{ form.shift1_mod|as_crispy_field }}, так что на самом деле оно должно быть {{ create_new_handoff_form.shift1_mod|as_crispy_field }}, но я попробовал изменить это и все равно получил ту же проблему, плюс, другая форма модели прекрасно работает с просто формой, несмотря на то, что имя формы - attention_form.
У кого-нибудь есть идеи или кто может направить меня в нужном направлении? :)
Вы не передаете форму через контекст в шаблоне. Поскольку вы наследуете View, добавьте следующую строку в метод get() и затем в метод post() соответствующим образом:
form = NewHandoffForm()
# and then change return
return render(request,'handoff/handoff-new.html', {'form': form })
Кроме того, у вас есть пробел после render в функции get. Я надеюсь, что это опечатка здесь, а не в вашем коде.