Browse Source

Chapter 11 Quote Model Form

Steve Thielemann 7 years ago
parent
commit
2e874b949d

BIN
django_site/db.sqlite3


+ 1 - 0
django_site/django_site/settings.py

@@ -37,6 +37,7 @@ ALLOWED_HOSTS = []
 
 INSTALLED_APPS = [
     'pages.apps.PagesConfig',
+    'quotes.apps.QuotesConfig',
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',

+ 5 - 1
django_site/django_site/static/main.css

@@ -95,4 +95,8 @@ input {
     color: green;
     border: 1px solid green;
     border-radius: 3px;
-}
+}
+
+.required label:after {
+    content: "*";
+}

+ 1 - 0
django_site/django_site/templates/base.html

@@ -23,6 +23,7 @@
 	    <li>Menu 1</li><li>Menu 2</li><li>Menu 3</li>
 	    {% endblock sidenav %}
 	    <li><a href="/contact">Contact Us</a></li>
+	    <li><a href="/quote">Get a Quote</a></li>
 	  </ul>
 	</nav>
       </aside>

+ 1 - 0
django_site/django_site/urls.py

@@ -19,5 +19,6 @@ from django.contrib import admin
 
 urlpatterns = [
     url(r'^admin/', admin.site.urls),
+    url(r'^quote', include('quotes.url')),
     url(r'^', include('pages.urls')),
 ]

+ 0 - 0
django_site/quotes/__init__.py


+ 24 - 1
django_site/quotes/admin.py

@@ -1,3 +1,26 @@
 from django.contrib import admin
 from .models import Quote
-admin.site.register(Quote)
+
+class QuoteAdmin(admin.ModelAdmin):
+    list_display = ('id', 'name', 'company', 'submitted', 'quotedate', 'quoteprice')
+    list_filter = ('submitted', 'quotedate')
+    readonly_fields = ('submitted',)
+    fieldsets = (
+        (None, {
+            'fields': ('name', 'email', 'description')
+        }),
+        ('Contact Information', {
+            'classes': ('collapse',),
+            'fields': ('position', 'company', 'address', 'phone', 'web')
+        }),
+        ('Job Information', {
+            'classes': ('collapse',),
+            'fields': ('sitestatus', 'priority', 'jobfile', 'submitted')
+        }),
+        ('Quote Admin', {
+            'classes': ('collapse',),
+            'fields': ('quotedate', 'quoteprice', 'username')
+        }),
+    )
+    
+admin.site.register(Quote, QuoteAdmin)

+ 3 - 0
django_site/quotes/admin.py~

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 5 - 0
django_site/quotes/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class QuotesConfig(AppConfig):
+    name = 'quotes'

+ 13 - 0
django_site/quotes/forms.py

@@ -0,0 +1,13 @@
+from django import forms
+from django.forms import ModelForm
+from .models import Quote
+
+class QuoteForm(ModelForm):
+    require_css_class = 'required'
+    class Meta:
+        model = Quote
+        fields = [
+            'name', 'position', 'company', 'address',
+            'phone', 'email', 'web', 'description',
+            'sitestatus', 'priority', 'jobfile'
+        ]

+ 40 - 0
django_site/quotes/migrations/0001_initial.py

@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.6 on 2017-11-01 02:22
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Quote',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=100)),
+                ('position', models.CharField(blank=True, max_length=60)),
+                ('company', models.CharField(blank=True, max_length=60)),
+                ('address', models.CharField(blank=True, max_length=200)),
+                ('phone', models.CharField(blank=True, max_length=30)),
+                ('email', models.EmailField(max_length=254)),
+                ('web', models.URLField(blank=True)),
+                ('description', models.TextField()),
+                ('sitestatus', models.CharField(choices=[('NEW', 'New Site'), ('EX', 'Existing Site')], max_length=20)),
+                ('priority', models.CharField(choices=[('U', 'Urgent - 1 week or less'), ('N', 'Normal - 2 to 4 weeks'), ('L', 'Low - Still Researching')], max_length=40)),
+                ('jobfile', models.FileField(blank=True, upload_to='uploads/')),
+                ('submitted', models.DateField(auto_now_add=True)),
+                ('quotedate', models.DateField(blank=True, null=True)),
+                ('quoteprice', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=7)),
+                ('username', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]

+ 0 - 0
django_site/quotes/migrations/__init__.py


+ 3 - 0
django_site/quotes/models.py~

@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.

+ 31 - 0
django_site/quotes/templates/quotes/quote.html

@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+
+{% block title %}Quote Request{% endblock title %}
+
+{% block sidenav %}
+{% for page in page_list %}
+<li><a href="{{ page.permalink }}">{{ page.title }}</a></li>
+{% endfor %}
+{% endblock sidenav %}
+
+{% block content %}
+<h1>Quote Request</h1>
+
+{% if submitted %}
+<p class="success">
+  Your quote was submitted successfully.  Thank you.
+</p>
+
+{% else %}
+<form action="" enctype="multipart/form-data" method="post" novalidate>
+  <table>
+    {{ form.as_table }}
+    <tr>
+      <td>&nbsp;</td>
+      <td><input type="submit" value="Submit"></td>
+    </tr>
+  </table>
+  {% csrf_token %}
+  </form>
+{% endif %}
+{% endblock content %}

+ 0 - 0
django_site/quotes/templates/quotes/quote.html~


+ 3 - 0
django_site/quotes/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 6 - 0
django_site/quotes/url.py

@@ -0,0 +1,6 @@
+from django.conf.urls import url
+from . import views
+
+urlpatterns = [
+    url(r'^$', views.quote_req, name='quote-request'),
+]

+ 22 - 0
django_site/quotes/views.py

@@ -0,0 +1,22 @@
+from django.shortcuts import render
+from django.http import HttpResponseRedirect
+
+from .models import Quote
+from .forms import QuoteForm
+from pages.models import Page
+
+def quote_req(request):
+    submitted = False
+    if request.method == 'POST':
+        form = QuoteForm(request.POST, request.FILES)
+        if form.is_valid():
+            form.save()
+            return HttpResponseRedirect('/quote?submitted=True')
+    else:
+        form = QuoteForm()
+        if 'submitted' in request.GET:
+            submitted = True
+    return render(request, 'quotes/quote.html', {'form': form,
+                                                 'page_list': Page.objects.all(),
+                                                 'submitted': submitted})
+

+ 3 - 0
django_site/quotes/views.py~

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

BIN
django_site/uploads/ckc-tote.pdf