【问题标题】:Django form for writing blogs用于写博客的 Django 表单
【发布时间】:2020-09-25 01:16:58
【问题描述】:

作为 Django 的初学者,我知道如何使用字段标题和内容的 Django 模型为博客创建基本网站......就是这样。

但现在我想创建一个真正的动态博客表单,它可以有多个子标题、代码块、文本块和图像。

或者基本上是一个博客表单,可以有随机数量的这些类型的块(代码、文本、图像等字段)。并且用户可以根据需要添加任意数量的这些块。

此外,这些将成为博客文章一部分的块(或字段)应按照与用户创建的顺序相同的顺序保存在数据集中。

我怎样才能做到这一点?

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript python html django django-forms


    【解决方案1】:

    这可能对你有用-

    注意:我没有运行此代码。所有代码都是我在stackoverflow中编写的。如有错别字请见谅。

    models.py

    from django.db import models
    
    class Blog(models.Model):
        title = models.CharField(max_length=200)
        body = models.TextField()
        // and more fields if you want
    
        def blog_field_exists(self):
            return self.blogfield_set.count() > 0
    
        def __str__(self):
            return self.title
    
    class BlogField(models.Model):
        title = models.CharField(max_length=200)
        body = models.TextField()
        image_url = models.URLField(blank=True, null=True) // blank means image is 
        // optional
        blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.title
    

    views.py

    from django.views import generic
    from .models import Blog
    
    {...}
    
    class BlogDetailView(generic.DetailView)
        model = Blog
        template_name = 'app/blog_detail.html'
    

    urls.py

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('<int:pk>', views.BlogDetailView.as_view(), name='blog_view')
    ]
    

    admin.py

    from django.contrib import admin
    from .models import *
    
    class BlogFieldInline(admin.TabularInline)
        model = BlogField
        extra = 1
    
    class BlogAdmin(admin.ModelAdmin):
        inlines = [BlogFieldInline]
    
    admin.site.register(BlogField)
    admin.site.register(Blog, BlogAdmin)
    

    模板/app/blog_detail.html

    {...} // previous code
    
    {% for blog in blog_list %}
    <h1>{{blog.title}}</h1>
    <p>{{blog.body}}</p>
    {% if blog.blog_field_exists %}
        {% for field in blog.blogfield_set.all %}
            <div style="margin: 1rem 0;">
                <hr>
                <h4>{{field.title}}</h4>
                <p>{{field.body}}</p>
                <img src="{{field.image_url}}" alt="{{field.title}}" />
                <hr>
            </div>
        {% endfor %}
    {% endif %}
    {% endfor %}
    

    【讨论】:

    • 这里的图片是什么 - “admin.site.register(Image)”,我无法绕过那个部分,因为在模型中只有 Blog 和 BlogField。
    • 我也收到了TypeError: 'MediaDefiningClass' object is not iterable 在这条线上admin.site.register(BlogAdmin, BlogAdmin)
    • 对不起,我写错了 admin.site.register(Image)。我现在已经删除了!
    • 现在尝试运行它!我编辑并删除了我能找到的所有错误!如果您仍然遇到错误,请告诉我。
    • 感谢您的帮助。这次我收到Generic detail view BlogDetailView must be called with either an object pk or a slug in the URLconf.Generic detail view BlogDetailView must be called with either an object pk or a slug in the URLconf.
    【解决方案2】:

    添加一个所见即所得的编辑器包是一种非常简单易行的方法。

    您有SummernoteCKEditorTinymice,它们是目前最流行的。

    它们每个的安装都非常简单直接,因此您不会有任何问题。

    您还可以查看djangopackages 网站,了解您可能需要的一切。这是一个查找评论区包、新闻通讯等内容的好地方。

    【讨论】:

    • 感谢您的建议,虽然我最终还是想在使用纯 Django 无法使用它们时使用它们。他们仍然非常有帮助。再次感谢
    • 好吧,所以我只是建议您使用 javascript 并自己实现每个功能。祝你好运!
    • 实际上 javascript 已经完成了,唯一的问题是如何将动态创建的数据(博客)放入 django 模型中,然后保存。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2012-03-30
    • 2021-04-16
    相关资源
    最近更新 更多