首页 > 解决方案 > django 数据库没有从我输入的详细信息中保存联系人数据

问题描述

我是 dajngo 项目的新手,我创建了一个名为“blog”的应用程序的博客。一切顺利,我坚持使用 conatct from。当我在联系人中提交详细信息并转到 djando 管理数据库时,联系人详细信息是没有保存在这里。

这是我的contact.html 代码

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
        
            <!-- Bootstrap CSS -->
            <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
        <title>contact us</title>
        </head>
        {% load static %}
        <body style="background-image: url('{% static " img/contact.jpg" %}');background-size: cover;">
        
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
        
        <div class="container my-3" style="padding:70px 0">
            <h3>Contact Us</h3>
            <form method="post" action="{% url "contact" %}" > {% csrf_token %}
        
          <div class="form-group">
            <label for="name">Name</label>
            <input type="text" class="form-control" id="name" name='name' placeholder="Enter Your Name">
          </div>
          <div class="form-group">
            <label for="name">Email</label>
            <input type="email" class="form-control" id="email" name='email' placeholder="Enter Your Email">
          </div>
        
            <div class="form-group" >
            <label for="name">Phone</label>
            <input type="tel" class="form-control" id="phone" name='phone' placeholder="Enter Your Phone Number">
          </div>
        
        
           <div class="form-group" >
            <label for="desc">How May We Help You?</label>
            <textarea class="form-control" id="desc" name='desc' rows="3"></textarea>
            </div>
                <button style=" margin-top: 25px;" type="submit" class="btn btn-success">Submit</button>
            </form>
        
        
        
        </div>
        </body>
        
        </html>
        

        

这是 post_detail.html

    {% extends 'base.html' %} {% block content %}
    {% load crispy_forms_tags %}
    
    <div class="container">
      <div class="row">
        <div class="col-md-8 card mb-4  mt-3 left  top">
          <div class="card-body">
            <h1>{% block title %} {{ post.title }} {% endblock title %}</h1>
            <p class=" text-muted">{{ post.author }} | {{ post.created_on }}</p>
            <p class="card-text ">{{ post.content | safe }}</p>
          </div>
        </div>
        {% block sidebar %} {% include 'sidebar.html' %} {% endblock sidebar %}
    
        <div class="col-md-8 card mb-4  mt-3 ">
          <div class="card-body">
            <!-- comments -->
            <h2>{{ comments.count }} comments</h2>
    
            {% for comment in comments %}
            <div class="comments" style="padding: 10px;">
              <p class="font-weight-bold">
                {{ comment.name }}
                <span class=" text-muted font-weight-normal">
                  {{ comment.created_on }}
                </span>
              </p>
              {{ comment.body | linebreaks }}
            </div>
            {% endfor %}
          </div>
        </div>
        <div class="col-md-8 card mb-4  mt-3 ">
          <div class="card-body">
            {% if new_comment %}
            <div class="alert alert-success" role="alert">
              Your comment is awaiting moderation
            </div>
            {% else %}
            <h3>Leave a comment</h3>
            <form method="post" style="margin-top: 1.3em;">
              <!--{{ comment_form.as_p }}-->
              {{ comment_form | crispy }}
              {% csrf_token %}
              <button type="submit" class="btn btn-primary  btn-lg">Submit</button>
            </form>
            {% endif %}
          </div>
        </div>
      </div>
    </div>
    {% endblock content %}
    
    

这是 admin.py

            from django.contrib import admin
            from .models import Post,Comment
            from .models import Contact
            
            
            from django_summernote.admin import SummernoteModelAdmin
            
            
            
            
            class PostAdmin(admin.ModelAdmin):
                list_display = ('title', 'slug', 'status', 'created_on')
                list_filter = ("status",)
                search_fields = ['title', 'content']
                prepopulated_fields = {'slug': ('title',)}
            
            @admin.register(Comment)
            class CommentAdmin(admin.ModelAdmin):
                list_display = ('name', 'body', 'post', 'created_on', 'active')
                list_filter = ('active', 'created_on')
                search_fields = ('name', 'email', 'body')
                actions = ['approve_comments']
            
                def approve_comments(self, request, queryset):
                    queryset.update(active=True)
            
            class PostAdmin(SummernoteModelAdmin):
                summernote_fields = ('content',)
            
            
            admin.site.register(Post, PostAdmin)
            admin.site.register(Contact)
            
This is models.py
        

            from django.db import models
            from django.contrib.auth.models import User
            
            
            STATUS = (
                (0,"Draft"),
                (1,"Publish")
            )
            
            class Post(models.Model):
                title = models.CharField(max_length=200, unique=True)
                slug = models.SlugField(max_length=200, unique=True)
                author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
                updated_on = models.DateTimeField(auto_now= True)
                content = models.TextField()
                created_on = models.DateTimeField(auto_now_add=True)
                status = models.IntegerField(choices=STATUS, default=0)
            
                class Meta:
                    ordering = ['-created_on']
            
                def __str__(self):
                    return self.title
                def get_absolute_url(self):
                    from django.urls import reverse
            
                    return reverse("post_detail", kwargs={"slug": str(self.slug)})
            class Comment(models.Model):
                post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
                name = models.CharField(max_length=80)
                email = models.EmailField()
                body = models.TextField()
                created_on = models.DateTimeField(auto_now_add=True)
                active = models.BooleanField(default=False)
            
                class Meta:
                    ordering = ['created_on']
            
                def __str__(self):
                    return 'Comment {} by {}'.format(self.body, self.name)
            
            
            class Contact(models.Model):
                msg_id = models.AutoField(primary_key=True)
                name = models.CharField(max_length=50)
                email = models.CharField(max_length=70, default="")
                phone = models.CharField(max_length=70, default="")
                desc = models.CharField(max_length=500, default="")
            
            
                def __str__(self):
                    return self.name
            
            

这是 urls.py

    from . import views
    from django.urls import include
    
    
    from django.urls import path
    from .feeds import LatestPostsFeed, AtomSiteNewsFeed
    
    urlpatterns = [
        path("feed/rss", LatestPostsFeed(), name="post_feed"),
        path("feed/atom", AtomSiteNewsFeed()),
        path("<slug:slug>/", views.post_detail, name="post_detail"),
    
        path("", views.PostList.as_view(), name="home"),
        path("about.html",views.about,name='about'),
        path("contact.html",views.contact,name='contact'),
        path("blb.html",views.blb,name='blb '),
    
    
    
    
        path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
    
    ]
    
    

这是 view.py

    from .models import Post
    from django.views import generic
    from .forms import CommentForm
    from django.shortcuts import render, get_object_or_404
    from .models import Contact
    
    
    
    def about(request):
        return render(request,'about.html',{})
    def contact(request):
        return render(request,'contact.html',{})
    def blb(request):
        return render(request,'blb.html',{})
    def Contact(request):
        if request.method == "POST":
            name = request.POST.get['name','']
            email = request.POST.get['email','']
            phone = request.POST.get['phone','']
            content = request.POST.get['content','']
            contact = Contact(name=name, email=email, phone=phone, content=content)
            contact.save()
        return render(request, "contact.html")
    class PostList(generic.ListView):
        queryset = Post.objects.filter(status=1).order_by("-created_on")
        template_name = "index.html"
        paginate_by = 3
    
    class PostDetail(generic.DetailView):
        model = Post
        template_name = 'post_detail.html'
    
    def post_detail(request, slug):
        template_name = 'post_detail.html'
        post = get_object_or_404(Post, slug=slug)
        comments = post.comments.filter(active=True)
        new_comment = None
        # Comment posted
        if request.method == 'POST':
            comment_form = CommentForm(data=request.POST)
            if comment_form.is_valid():
    
                # Create Comment object but don't save to database yet
                new_comment = comment_form.save(commit=False)
                # Assign the current post to the comment
                new_comment.post = post
                # Save the comment to the database
                new_comment.save()
        else:
            comment_form = CommentForm()
    
        return render(request, template_name, {'post': post,
                                               'comments': comments,
                                               'new_comment': new_comment,
                                               'comment_form': comment_form})
    
    
    

这是项目 urls.py

    from django.contrib import admin
    from django.urls import path, include
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    from django.contrib.sitemaps.views import sitemap
    from blog.sitemaps import PostSitemap
    
    
    sitemaps = {
        "posts": PostSitemap,
    }
    
    urlpatterns = [
        path("admin/", admin.site.urls),
        path("", include("blog.urls"), name="blog-urls"),
        path("summernote/", include("django_summernote.urls")),
        path("sitemap.xml", sitemap, {"sitemaps": sitemaps}, name="sitemap"),
    
    ]
    
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
   

在此处输入图像描述

      [1]: https://i.stack.imgur.com/RCOt4.png

标签: pythonhtmlcssdjango

解决方案


首先,您不应该将 html 模板的名称放在应用程序的 urls.py 中。我的意思是这三行:

path("about.html",views.about,name='about'),
path("contact.html",views.contact,name='contact'),
path("blb.html",views.blb,name='blb '),

例如,您必须将它们替换为

path('contact/',...)

为了获得更好、更简洁的代码,最好在您的应用程序中使用表单。在您的应用程序 DIR 中创建forms.py并在您的 forms.py 中导入您的模型,例如:

from django import forms
from .models import Profile

class {model name (Table name)}(forms.ModelForm):
    class Meta:
        model = {model name (Table name)}
        fields = '__all__'

在您的 models.py 中将 {model name (Table name)} 替换为您的模型。然后在HTML 模板中的每个输入字段中,对于名称attr ,您应该使用与 models.py 字段中使用的名称相同的名称。

在你的views.py中你应该这样做:

form = **{form name}**(request.POST or None, request.FILES)
if form.is_valid():
    form.save()
    return redirect('**{  somewhere :) }**')

return render(request, 'contact.html', {'form': form})

希望这个答案可以帮助你;-)


推荐阅读