I've been scratching my head on this for 2 days now, hoping someone can help me figure out what I am missing.
I was able to submit before, but changed something, and I can't figure out what.
When I try and add a new Client, the page just reloads, doing nothing.
But when I go and edit one that is already created (using the admin console) it works as expected.
models.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
views.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
forms.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']
urls.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 %}
I was able to get help from GinFuyou on #Django on via irc.Freenode.net
The issue was that I need to have enctype="multipart/form-data" on client_form.html
full line should be
<form enctype="multipart/form-data" method="POST">
This is due to having files upload to the form.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.