Django - 开发站点

Django NBA Web开发 - Step 6 发布文章

2019-03-03  本文已影响2人  AllenBigBear

有了用户,有了关注系统,接下来,在自己喜欢的球队页面下面,发布文章,也是一个日常使用频率很高的功能。

不想很简单地只做一个输入框,所以下载了一个Django里面可用的Markdown编辑器 mdeditor
作者的Github是

https://github.com/pylixm/django-mdeditor

按照作者的使用说明,一步一步傻瓜式操作,就可在页面上生成Markdown的编辑器了
如何使用就请看作者的说明。我只记录一下我这里的效果,首先还是加入settings里的app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mainsite',
    'team',
    'users',
    'mdeditor',
]

其次,对文章系统进行模型建立, 注意,article_content这个字段,我就是用的是插件的字段MDTexdField

而team则是文章和球队建立起一对多的关系,文章是“多”侧,球队是“一”侧
user是文章和用户建立起一对多的关系,文章是“多”侧,球队是“一”侧

在Article类下面,我还另外进行了ArticleForm的建模,他继承自ModelForm这个类,这个功能就是,通过模型,可以直接生成表单,下面Meta里的model属性就是告诉表单,我是要和哪个类进行匹配,而exclude则是告诉表单,除了这2个字段我不想在表单生成是显示,其他都需要显示。
关于详细的ModelForm功能,可以参考https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#django.forms.ModelForm

class Article(models.Model):
    article_id = models.AutoField('文章序号',primary_key=True)
    article_title = models.CharField('文章标题',max_length=150)
    article_content = MDTextField('文章内容',max_length=1000)
    team = models.ForeignKey(Team,on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.CASCADE,null=True,blank=True,default=None)

    def __str__(self):
        return self.article_title

class ArticleForm(ModelForm):
     class Meta:
            model = Article
            exclude = ['team','user']

模型建立完之后,来到views视图

根据URL地址内的球队编号,过滤出所有这个球队相关的文章
如果请求是GET,只是显示空白表单,如上面建模时候所显示,除了team和user之外,都不会进行渲染,而article_id这个字段因为是AutoField,无法被ModelForm渲染,所以前端只会渲染文章标题和文章内容这2个内容。

from django.shortcuts import render,redirect
from mainsite.models import *
# Create your views here.

def team_page(request,team_id):

    team_name = Team.objects.get(team_id=team_id)
    team_articles = Article.objects.filter(team_id=team_id)

    if request.method == "GET":
        article_form = ArticleForm()
    elif request.method == 'POST':
        form = ArticleForm(request.POST)
        f = form.save(commit=False)
        f.user = request.user
        f.team_id = team_id
        f.save()
        return redirect('team:team_page',team_id=team_id)
    return render(request,'team_page.html',{'team_name':team_name,'team_articles':team_articles,'article_form':article_form})

最后,来看下前端渲染页面

{% extends 'base_page.html' %}
{% load staticfiles %}
{% block title %}球队介绍{% endblock %}
{% block content %}

    <img src="{% static '/team_icon/' %}{{team_name.team_english_name}}.png" width="110" height="110">
    {{team_name.team_chinese_name}}
    <p>简介</p>
    来自于{{team_name.team_location}}的球队
    <br>
    文章列表:
    <ul>
    {% for i in team_articles %}
        <li><a href="{% url 'team:article_detail' i.article_id %}">{{i.article_title}}</a></li>
    {% endfor %}
    </ul>

    {% if user.is_authenticated %}
        <form method="post">
        {% csrf_token %}
        {{article_form.media}}
        {{article_form.as_p}}
        <button type="submit">提交</button>
        </form>
    {% endif %}
{% endblock %}

效果图如下,在页面上显示有多少和这个球队相关的文章,后续再做分页功能吧.


球队页面
上一篇 下一篇

猜你喜欢

热点阅读