我正试图为现有模型创建一个前端数据输入页面。但是,当单击链接时,我会得到一个错误:
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。
有人知道或能指出正确的方向吗?:)
发布于 2022-03-05 13:16:46
您不会通过模板中的上下文传递表单。在继承View时,适当地在get()和post()方法中添加以下行:
form = NewHandoffForm()
# and then change return
return render(request,'handoff/handoff-new.html', {'form': form })此外,在get函数中,在呈现后有一个空格。我希望这是一个错误,但不是在您的代码。
https://stackoverflow.com/questions/71362368
复制相似问题