美文网首页Django - 开发站点
Django NBA Web开发 - Step 6 发布文章

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

作者: AllenBigBear | 来源:发表于2019-03-03 15:59 被阅读2次

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

    不想很简单地只做一个输入框,所以下载了一个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 %}
    

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


    球队页面

    相关文章

      网友评论

        本文标题:Django NBA Web开发 - Step 6 发布文章

        本文链接:https://www.haomeiwen.com/subject/yqapuqtx.html