📜  将用户与其在 Django 中的上传(发布)相关联

📅  最后修改于: 2022-05-13 01:54:19.688000             🧑  作者: Mango

将用户与其在 Django 中的上传(发布)相关联

Django 提供了 ForeignKey、ManytoManyField 的内置功能,用于将一个模型关联到另一个模型。要将用户模型与帖子模型相关联,可以使用各种选项。本文围绕如何将用户与其帖子(帖子模型)相关联。本教程使用 Django 中的外键概念,最后,将能够创建发布上传的应用程序以及包含用户所有过去上传的配置文件应用程序。

先决条件——

  1. Django项目的创建
  2. 创建可以注册登录和注销用户的应用程序
  3. 在应用程序中进行迁移并添加数据库

我们已经创建了一个用于注册的用户应用程序,因此我们将创建一个可以命名为 userblog(来自用户的博客上传)的新应用程序。为此,通过在您的 PowerShell 或终端中编写此代码,在主项目文件中创建一个应用程序

django-admin startapp userblog

现在这个应用程序在您的项目文件中可用,您应该首先将此应用程序添加到项目的 settings.py 文件中,然后将此应用程序添加到INSTALLED_APPS

现在在您的项目中进行迁移并将此应用程序添加到您的项目中

python manage.py makemigrations
python manage.py migrate

现在我们必须在这个应用程序中使用模型,以便 Django 可以为我们要存储在数据库中的信息创建一个表,并且用户可以输入信息。我们必须在 userblog 应用程序的models.py文件中创建一个名为 Snippet 的类。我们将使用一个 ForeignKey 类,它将保存用户的 id 值,并且它拥有一对多的关系,因此您可以使用该类将用户与用户参与的任何其他活动相关联。

from django.db import models
from django.conf import settings
  
User = settings.AUTH_USER_MODEL
  
# Create your models here.
class Snippet(models.Model):
    user = models.ForeignKey(User,
                        default = 1,
                        null = True, 
                        on_delete = models.SET_NULL
                        )
    blogname = models.CharField(max_length = 100)
    blogauth = models.CharField(max_length = 100)
    blogdes = models.TextField(max_length = 400)
    img = models.ImageField(upload_to ='pics')
  
    def __str__(self):
        return self.blogname

还要创建一个名为forms.py的Python文件,并为其创建一个 ModelForm 以从用户输入数据。

from django import forms
from .models import Snippet
  
class SnippetForm(forms.ModelForm):
    class Meta:
        model = Snippet
        fields = ['blogname',
        'img',
        'blogauth',
        'blogdes'
        ]

我们需要迁移 Snippet 的类模型,以便 Django 管理创建一个用于发布上传和详细信息的数据库,因此对类 Snippet 进行迁移,您将在 django 管理中看到这一点 -
凉爽的
这里 User 是一个外键,它将显示所有用户,它将存储用户上传的最后一个实例的密钥号,默认情况下它设置为超级用户
现在我们将转到应用程序的views.py文件并添加将使用模型表单对象将信息存储在数据库中的主要代码。

  • usblog – 这将显示我们主页中的所有帖子
  • snippet_detail – 这将在表单广告中从用户那里获取数据,它将博客与用户相关联
from django.shortcuts import render
from django.http import HttpResponse
from .forms import SnippetForm
from .models import Snippet
from django.contrib import messages
# Create your views here.
def usblog(request):
    snipps = Snippet.objects.all()
    return render(request, 'indexg.html', {'snipps' : snipps})
  
def snippet_detail(request):
    form = SnippetForm(request.POST or None, request.FILES or None)
    if request.method =='POST':
          
        if form.is_valid():
              
            obj = form.save(commit = False)
            obj.user = request.user;
            obj.save()
            form = SnippetForm()
            messages.success(request, "Successfully created")
          
  
    return render(request, 'form.html', {'form':form})

所以到现在 Django 管理已经创建了 Snippet 类的数据库,你可以通过访问 Django 管理来查看它。现在我们必须创建一个简单的form.html文件,我们将包含一个表单,用户可以在其中输入我们在课堂上陈述的查询。这就是 Django 的美妙之处,因为我们已经为我们的应用程序使用了模型表单,Django 已经创建了表单的 HTML 代码,它将包含我们需要的所有查询。因此,只需在模板文件 (form.html) 中创建一个 HTML 文件。



  

    
    
    
    Your Blog

  

    
        {% csrf_token %}         {{form.as_p}}              
  

现在我们需要一个主页,我们将在其中看到用户的所有帖子,因此创建另一个 HTML 文件 indexg.html 并导入我们在 views.py 文件中创建的函数对象。 (仅放置 html 正文部分的图像以显示您可以使用 features 制作自己的 indexg 的Python代码)


    

Post play

Only for geeks

            
        {% if user.is_authenticated %}         Hi {{user.username}}         Logout         Write post         {% else %}         Register         Login         {% endif %}     
    

        {% for snips in snipps %}            Image         

{{snips.blogname}}

        

{{snips.user}}

        {% if user.is_authenticated %}         

{{snips.blogdes}}

        {% else %}         

Register/Login to know more

        {% endif %}               {% endfor %}        

    

让我们转到我们将拥有一个帐户应用程序的主 urls 文件,现在将 userblog 应用程序设置为默认应用程序并添加您的应用程序的 URL。同样在您的用户博客应用程序中添加 urls.py 并添加 2 个函数的链接,它们是 form.html 和 homepage(indexg.html)。
主要网址

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
   path('', include('userblog.urls')),
     
    path('admin/', admin.site.urls),
    path('accounts/', include('accounts.urls'))
      
]

用户博客网址 –

from django.urls import path
  
from . import views
urlpatterns = [
      
    path("snippet_detail", views.snippet_detail),
    path('', views.usblog, name ='usblog')
]

启动应用程序并将用户注册到您的应用程序并发布帖子

python manage.py runserver

您的浏览器不支持播放视频

GITHUB 链接 – Github 回购