#python #html #django #web-applications
#python #HTML #django #веб-приложения
Вопрос:
Я только начал использовать django, и это мое первое приложение. я создал «контактную форму» в зависимости от нескольких руководств, которые я видел, но она не сохраняет данные в базе данных и не направляет меня на HTML-страницу «Спасибо».
перепробовал много сценариев, но ни один из них не сработал, кто-нибудь может помочь? я открыт для изменения любой вещи в коде, чтобы заставить его работать и сохранить данные, которые мне нужно сохранить.
setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
# 'crispy_forms',
'widget_tweaks',
models.py
from django.db import models
from django.conf import settings
from datetime import date
class Snippet(models.Model):
MALE = 'MA'
FEMALE = 'FE'
GENDER_CHOICES = [
(MALE, 'Male'),
(FEMALE, 'Female'),
]
LOCAL = 'SA'
NONE_LOCAL = 'NS'
NAT_CHOICES = [
(LOCAL, 'Local'),
(NONE_LOCAL, 'Non_Local'),
]
RIYADH = 'RH'
JEDDAH = 'JH'
CITY_CHOICES = [
(RIYADH, 'Riyadh'),
(JEDDAH, 'Jeddah'),
]
DIPLOMA = 'DP'
BACHELOR = 'BA'
HIGHEREDU = 'HE'
OTHER = 'OT'
EDU_CHOICES = [
(DIPLOMA, 'Diploma'),
(BACHELOR, 'Bachelor'),
(HIGHEREDU, 'Higer Edu'),
(OTHER, 'Other'),
]
ONE = 'On'
FIVE = 'Fi'
OTHER = 'Ot'
INC_CHOICES = [
(ONE, '100-500'),
(FIVE, '500-1000'),
(OTHER, 'Other'),
]
name = models.CharField(max_length=100)
email = models.EmailField()
mobile = models.IntegerField(default=None)
gender = models.CharField(
max_length=2, choices=GENDER_CHOICES, default=MALE)
nat = models.CharField(
max_length=2, choices=NAT_CHOICES, default=LOCAL)
city = models.CharField(
max_length=2, choices=CITY_CHOICES, default=RIYADH)
dob = models.DateField(default=None)
edu = models.CharField(
max_length=2, choices=EDU_CHOICES, default=OTHER)
major = models.CharField(max_length=100)
inc = models.CharField(max_length=2, choices=INC_CHOICES, default=ONE)
def __str__(self):
return '{} {} {} {} {} {} {} {} {} {}'.format(self.name, self.email, self.mobile, self.gender in {self.MALE, self.FEMALE}, self.dob, self.nat in {self.LOCAL, self.NONE_LOCAL}, self.city in {self.RIYADH, self.JEDDAH}, self.edu in {self.DIPLOMA, self.BACHELOR, self.HIGHEREDU, self.OTHER}, self.major, self.inc in {self.ONE, self.FIVE, self.OTHER})
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home),
path('form/', views.contact),
path('home/', views.home),
path('thank/', views.thank),
path('about/', views.about),
forms.py
from django import forms
from .models import Snippet
from django.core.validators import RegexValidator
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField(label='Email')
mobile = forms.IntegerField(label='Mobile', required=True)
gender = forms.ChoiceField(
choices=[('select', 'Select'), ('male', 'Male'), ('female', 'female')])
dob = forms.DateField(required=False)
nat = forms.ChoiceField(label='Nationality',
choices=[('select', 'Select'), ('Local', 'Local'), ('non-Local', 'Non-Local')])
city = forms.ChoiceField(label='City',
choices=[('select', 'Select'), ('riyadh', 'Riyadh'), ('jeddah', 'Jeddah')])
edu = forms.ChoiceField(label='Education',
choices=[('select', 'Select'), ('diploma', 'Diploma'), ('bachelor', 'Bachelor'), ('higher edu', 'Higher Edu'), ('other', 'Other')])
major = forms.CharField(label='Major', required=False)
inc = forms.ChoiceField(label='Income', choices=[('select', 'Select'), (
'1000-5000', '1000-5000'), ('5000-10000', '5000-10000'), ('other', 'Other')])
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class SnippetForm(forms.ModelForm):
class Meta:
model = Snippet
fields = ('name', 'email', 'mobile', 'gender', 'dob',
'nat', 'city', 'edu', 'major', 'inc',)
views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import ContactForm, SnippetForm
from .models import Snippet
from django.db import models
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
mobile = form.cleaned_data['mobile']
gender = form.cleaned_data['gender']
dob = form.cleaned_data['dob']
nat = form.cleaned_data['nat']
city = form.cleaned_data['city']
edu = form.cleaned_data['edu']
major = form.cleaned_data['major']
inc = form.cleaned_data['inc']
form.save()
print(name, email, mobile, gender, dob, nat, city, edu, major, inc)
return snippet_detail(request.POST)
else:
form = ContactForm(request.POST)
return render(request, 'myapp/form.html', {'form': form})
def snippet_detail(request):
if (request.method == 'POST') and ("submit" in request.POST):
form = SnippetForm(request.POST)
if form.is_valid():
form.save()
form = SnippetForm()
return render(request, 'myapp/form.html', {'form': form})
def home(request):
return render(request, 'myapp/home.html')
def about(request):
return render(request, 'myapp/about.html')
def thank(request):
return render(request, 'myapp/thank.html')
form.html
{% extends 'myapp/main.html' %}</em>
{% load widget_tweaks %}
<em><!DOCTYPE html></em>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registeration</title>
<body>
{% block content %}
{% csrf_token %}
<div class="Container">
<h3>
Registeration Form
</h3>
<hr>
</div>
<section class="section">
<div class="Container">
<div class="Columns">
<div class="Column is-half is-offset-one-quarter">
<div class="field">
<p>
<label class="label">Name</label>
<div class="control">
{% render_field form.name class="input" placeholder="Your name" %}
</div>
</p>
</div>
<p>
<div class="field">
<label class="label">Email</label>
<div class="control">
{% render_field form.email class="input" placeholder="Your@email.com" %}
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Mobile</label>
<div class="control">
{% render_field form.mobile class="input" placeholder="Your Mobile" %}
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Gender</label>
<div class="control">
<div class="select">
{% render_field form.gender %}
</div>
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Date of Birth</label>
<div class="control">
{% render_field form.dob class="input" placeholder="Please Select" %}
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Nationality</label>
<div class="control">
<div class="select">
{% render_field form.nat %}
</div>
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">City</label>
<div class="control">
<div class="select">
{% render_field form.city %}
</div>
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Edu</label>
<div class="control">
<div class="select">
{% render_field form.edu %}
</div>
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Major</label>
<div class="control">
<div class="select">
{% render_field form.major class="input" placeholder="Your Major" %}
</div>
</div>
</div>
</p>
<p>
<div class="field">
<label class="label">Income</label>
<div class="control">
<div class="select">
{% render_field form.inc %}
</div>
</div>
</div>
</p>
<p>
<div class="field is-grouped">
<div class="control">
<button class="button" is-link="thank.html">Submit</button>
</div>
</div>
</p>
</div>
</div>
</div>
</div>
</section>
</body>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X 965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH 8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM B07jRM" crossorigin="anonymous"></script>
</html>
{% endblock %}
Комментарии:
1. Я думал, что форма должна быть определена внутри тега <form> </form> . Я не вижу этого в твоем form.html
2. спасибо за ваш ответ, я все изменил, и это сработало