python - CreateView 在提交时不保存,但在 UpdateView 上
问题描述
我已经为此挠头两天了,希望有人能帮我弄清楚我错过了什么。
我之前能够提交,但改变了一些东西,我不知道是什么。
当我尝试添加新客户端时,页面只是重新加载,什么都不做。
但是当我去编辑一个已经创建的(使用管理控制台)时,它会按预期工作。
模型.py
from django.urls import reverse
from django.db.models import CharField
from django.db.models import DateTimeField
from django.db.models import FileField
from django.db.models import IntegerField
from django.db.models import TextField
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth import get_user_model
from django.contrib.auth import models as auth_models
from django.db import models as models
from django.contrib.auth.models import User
from django_extensions.db import fields as extension_fields
FINANCING_TYPE = (
('LoanPal', 'LoanPal'),
('Renew', 'Renew'),
('GreenSky', 'GreenSky'),
('Cash/Card/Check', 'Cash/Card/Check'),
('Other', 'Other - Please Note'),
)
ROOF_TYPE = (
('Cement Flat', 'Cement Flat'),
('Cement S/W', 'Cement S/W'),
('Composite', 'Composite'),
('Clay', 'Clay'),
('Metal', 'Metal'),
('Other', 'Other - Please Note'),
)
JOB_STATUS = (
('New', 'New'),
('Sent to Engineer', 'Sent to Engineer'),
('Installer', 'Installer'),
('Completed', 'Completed'),
)
class Client(models.Model):
# Fields
sales_person = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
job_status = models.CharField(max_length=30, choices=JOB_STATUS, default="New")
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
street_address = models.CharField(max_length=100)
city = models.CharField(max_length=100)
zipcode = models.CharField(max_length=10)
phone_number = models.CharField(max_length=16)
email_address = models.CharField(max_length=100)
financing_type = models.CharField(max_length=30, choices=FINANCING_TYPE)
contract_amount = models.IntegerField()
contract_pdf = models.FileField(upload_to="upload/files/contracts/")
electric_bill = models.FileField(upload_to="upload/files/electric_bills/")
roof_type = models.CharField(max_length=30, choices=ROOF_TYPE)
edge_of_roof_picture = models.ImageField(verbose_name="Picture of Roof Edge", upload_to="upload/files/edge_of_roof_pictures/")
rafter_picture = models.ImageField(verbose_name="Picture of Rafter/Truss", upload_to="upload/files/rafter_pictures/")
biggest_breaker_amp = models.IntegerField()
electric_panel_picture = models.ImageField(verbose_name="Picture of Electrical Panel", upload_to="upload/files/electric_panel_pictures/")
electric_box_type = models.CharField(verbose_name="Top or bottom fed electric box (is there an overhead line coming in? Can you see where the electric line comes in?)", max_length=100)
main_panel_location = models.CharField(verbose_name="Main panel location (looking at house from street)", max_length=100)
additional_notes = models.TextField(verbose_name="Any Additional Notes?", blank=True)
customer_informed = models.BooleanField(verbose_name="Informed customer plans and placards will be mailed to them and make them available install day")
class Meta:
ordering = ('-created',)
def get_absolute_url(self):
return reverse('sales_client_detail', args=[str(self.id)])
def __str__(self):
return self.street_address
视图.py
from django.views.generic import DetailView, ListView, UpdateView, CreateView
from .models import Client
from .forms import ClientForm
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
class ClientListView(LoginRequiredMixin,ListView):
model = Client
def get_queryset(self):
if not self.request.user.is_staff:
return Client.objects.filter(sales_person=self.request.user)
else:
return Client.objects.all()
class ClientCreateView(LoginRequiredMixin,CreateView):
form_class = ClientForm
model = Client
class ClientDetailView(LoginRequiredMixin,DetailView):
model = Client
# def get_object(self):
# if not self.request.user.is_staff:
# return get_object_or_404(Client, sales_person=self.request.user)
# else:
# queryset = self.get_queryset()
# obj = get_object_or_404(queryset)
# return obj
class ClientUpdateView(LoginRequiredMixin,UpdateView):
model = Client
form_class = ClientForm
表格.py
from django import forms
from .models import Client
class ClientForm(forms.ModelForm):
class Meta:
model = Client
fields = ['first_name', 'last_name', 'street_address', 'city', 'zipcode',
'phone_number', 'email_address', 'financing_type', 'contract_amount',
'contract_pdf', 'electric_bill', 'roof_type', 'edge_of_roof_picture',
'rafter_picture', 'biggest_breaker_amp', 'electric_panel_picture',
'electric_box_type', 'main_panel_location', 'additional_notes', 'customer_informed']
网址.py
from django.urls import path, include
from . import views
urlpatterns = (
# urls for Client
path('clients/', views.ClientListView.as_view(), name='sales_client_list'),
path('client/create/', views.ClientCreateView.as_view(), name='sales_client_create'),
path('client/view/<int:pk>', views.ClientDetailView.as_view(), name='sales_client_detail'),
path('client/update/<int:pk>', views.ClientUpdateView.as_view(), name='sales_client_update'),
)
client_form.html
{% extends "base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<form method="POST">
{% csrf_token %}
{{form|crispy}}
<button class="btn btn-primary" type="submit">Submit</button>
</form>
{% endblock %}
解决方案
我能够通过 irc.Freenode.net 在#Django 上从 GinFuyou 获得帮助
问题是我需要在 client_form.html 上有 enctype="multipart/form-data"
整行应该是
<form enctype="multipart/form-data" method="POST">
这是由于将文件上传到表单。
推荐阅读
- visual-studio - 如何确保项目仅在发布配置中发布,同时仍让我在其他配置中进行调试?
- python - 如何查看在databricks中生成的pdf文件
- seaborn - 我的 Y 轴 seaborn 线图中的百分比缩放很乱
- .net - 是否可以在同一解决方案下创建 2 个基于服务总线队列触发且两个队列不同的 Azure 函数?
- javascript - 完成每个任务后,如何一遍又一遍地运行异步功能
- list - SwiftUI 初学者:带有表单和列表的 VStack
- javascript - 动画扫帚
- lotus-domino - 我必须在 NotesUiView 中获取用户选择的几个类别名称。可能吗?
- python - 如何用不同的数据填充热图的方块来确定方块的“热度”?
- ruby-on-rails - Webpacker 最新版本中未定义的方法`javascript_packs_with_chunks_tag`