функция отправки django не сохраняет данные в базе данных

#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. спасибо за ваш ответ, я все изменил, и это сработало