使用createview和modelform在django中自动将登录用户设置为作者

2023-11-29

我正在构建一个前端表单,允许某人在不访问管理员的情况下发布文章。

当用户登录时,我希望他/她能够写一篇文章。保存后,我希望该用户自动设置为文章的作者。

我陷入了僵局。任何帮助将非常感激。

模型.py

from django.db import models

from django.urls import reverse
from django.contrib.auth.models import User
from django.utils import timezone



class Article(models.Model):
    author = models.ForeignKey(User)
    title = models.CharField(max_length=65)
    text = HTMLField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class ArticleImage(models.Model):
    image = CloudinaryField('image')
    image_name = models.CharField(max_length=55,
                                    default='')
    article = models.ForeignKey(Article)

    def __str__(self):
        return self.image_name


class ArticleTag(models.Model):
    slug = models.SlugField(max_length=50,
                            unique=True)
    article = models.ForeignKey(Article)

    def __str__(self):
        return self.slug


class ArticleCategory(models.Model):
    slug = models.SlugField(max_length=20,
                            unique=True)
    article = models.ForeignKey(Article)

    def __str__(self):
        return self.slug

forms.py

class ArticleCreationForm(ModelForm):

    class Meta:
        model = Article
        fields = ['title', 'text']
        widgets = {
            'title': forms.TextInput(attrs={'placeholder': 'Please add a title. Max: 65 characters'}),
            'text': forms.Textarea(attrs={'cols': 80, 'rows': 40, 'placeholder': 'Starting typing your article...'})
        }

ArticleImageFormSet = inlineformset_factory(Article, ArticleImage,
                                            fields=('image', 'image_name',),
                                            extra=1,
                                            max_num=1,
                                            widgets={'image_name':
                    forms.TextInput(attrs={'placeholder': 'Image name'})})
ArticleTagFormSet = inlineformset_factory(Article, ArticleTag,
                                            fields=('slug',),
                                            extra=1,
                                            max_num=1)
ArticleCategoryFormSet = inlineformset_factory(Article, ArticleCategory,
                                            fields=('slug',),
                                            extra=1,
                                            max_num=1)

views.py

class CreateArticle(CreateView):
    model = Article
    form_class = ArticleCreationForm
    template_name_suffix = '_add_form'

    def get_success_url(self):
        return reverse('accounts:detail', kwargs={'pk': self.object.pk})

    def get(self, request, *args, **kwargs):
        """
        Handles GET requests and instantiates blank versions of the form
        and its inline formsets.
        """
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        articleimage_form = ArticleImageFormSet()
        articletag_form = ArticleTagFormSet()
        articlecategory_form = ArticleCategoryFormSet()
        return self.render_to_response(
            self.get_context_data(form=form,
                                  articleimage_form=articleimage_form,
                                  articletag_form=articletag_form,
                                  articlecategory_form=articlecategory_form))

    def post(self, request, *args, **kwargs):
        """
        Handles POST requests, instantiating a form instance and its inline
        formsets with the passed POST variables and then checking them for
        validity.
        """
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        articleimage_form = ArticleImageFormSet(self.request.POST)
        articletag_form = ArticleTagFormSet(self.request.POST)
        articlecategory_form = ArticleCategoryFormSet(self.request.POST)
        if (form.is_valid() and articleimage_form.is_valid() and
            articletag_form.is_valid() and articlecategory_form.is_valid()):
            return self.form_valid(form, articleimage_form, articletag_form,
                                    articlecategory_form)
        else:
            return self.form_invalid(form, articleimage_form, articletag_form,
                                        articlecategory_form)

    def form_valid(self, form, articleimage_form, articletag_form,
                    articlecategory_form):
        """
        Called if all forms are valid. Creates a Recipe instance along with
        associated Ingredients and Instructions and then redirects to a
        success page.
        """
        self.object = form.save()
        obj.author = request.user.username
        articleimage_form.instance = self.object
        articleimage_form.save()
        articletag_form.instance = self.object
        articletag_form.save()
        articlecategory_form.instance = self.object
        articlecategory_form.save()
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form, articleimage_form, articletag_form,
                        articlecategory_form):
        """
        Called if a form is invalid. Re-renders the context data with the
        data-filled forms and errors.
        """
        return self.render_to_response(
            self.get_context_data(form=form,
                                  articleimage_form=articleimage_form,
                                  articletag_form=articletag_form,
                                  articlecategory_form=articlecategory_form))

模板.html

<form enctype="multipart/form-data" action="" method="post">
            {% csrf_token %}
            <div class="row">
              <div class="medium-9 columns">
                {{ form.non_field_errors }}
                <h2 class="article-identifier">Add a new article</h2>
                <div class="fieldWrapper">
                  {{ form.title.errors }}
                  {{ form.title }}
                  <div id="title_feedback" class="text-right"></div>
                </div>

                <div class="fieldWrapper">
                  {{ form.text.errors }}
                  {{ form.text }}
                </div>
              </div>
              <div class="medium-3 columns">
                <div class="button-wrapper">
                  <input class="button" type="submit" value="Publish">
                </div>

                <fieldset class="image_upload">
                  <h2>Add an Image</h2>
                    {{ articleimage_form.management_form }}
                    {{ articleimage_form.non_form_errors }}
                    {% for form in articleimage_form %}
                        {{ form.id }}
                          <div class="inline {{ articleimage_form.prefix }}">
                              {{ form.image.errors }}
                              {{ form.image.label_tag }}
                              {{ form.image }}
                              {{ form.image_name.errors }}
                              {{ form.image_name.label_tag }}
                              {{ form.image_name }}
                          </div>
                    {% endfor %}
                </fieldset>

                <fieldset>
                  <h2>Add a Category</h2>
                  {{ articlecategory_form.management_form }}
                  {{ articlecategory_form.non_form_errors }}
                  {% for form in articlecategory_form %}
                      {{ form.id }}
                      <div class="inline {{ articlecategory_form.prefix }}">
                          {{ form.slug.errors }}
                          {{ form.slug.label_tag }}
                          {{ form.slug }}
                      </div>
                  {% endfor %}
                </fieldset>

                <hr />

                <fieldset>
                  <h2>Add a Tag</h2>
                  {{ articletag_form.management_form }}
                  {{ articletag_form.non_form_errors }}
                  {% for form in articletag_form %}
                      {{ form.id }}
                      <div class="inline {{ articletag_form.prefix }}">
                          {{ form.slug.errors }}
                          {{ form.slug.label_tag }}
                          {{ form.slug }}
                      </div>
                  {% endfor %}
                </fieldset>

              </div>
            </div>
        </form>

保存表格commit=False,在对象上设置用户,然后保存对象。在 - 的里面form_valid方法,您可以使用以下方式访问用户self.request.user。您应该分配用户实例,而不是像您的代码当前所做的那样分配用户名。

obj = form.save(commit=False)
obj.author = self.request.user
...
obj.save

您还应该将视图限制为登录用户。您可以使用LoginRequiredMixin为了这。

from django.contrib.auth.mixins import LoginRequiredMixin

class CreateArticle(LoginRequiredMixin, CreateView):
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用createview和modelform在django中自动将登录用户设置为作者 的相关文章

随机推荐

  • 施工期间的虚拟功能解决方法

    我有一个具有虚函数的基类 我想在构造过程中调用该类 因为我希望为每个派生类调用该函数 我知道我无法在构造过程中调用虚拟函数 但我想不出一个优雅的 即避免重复代码 解决方案 在构造过程中调用虚函数有哪些解决方法 我想避免这种情况的原因是因为我
  • 如何在 html 页面中创建“转到邮箱”链接?

    我正在创建一个确认页面 其中显示 验证电子邮件已发送到您的邮箱 电子邮件受保护 请点击
  • 如何将 Gradle 插件(及其依赖项)加载到 build.gradle 中?

    我有一个有两个 gradle 文件的项目 build gradle and myPlugin gradle The myPlugin gradle实现了插件接口 该插件还依赖于osDetector gradle 插件 我将两个 gradle
  • open() 函数对于包含特殊字符的文件路径无法正确运行

    我正在写这个简单的代码 file input File to read fhand open file r 我要打开的文件名为 test txt 它位于子文件夹中 因此 我在请求的输入中输入的是 DB test txt 嗯 它不起作用 返回
  • 如何在php中的特定日期发送?

    我想要一张电子贺卡或类似的东西 用户可以选择电子贺卡 选择后 他必须输入一些字段 例如姓名 收件人和发件人 电子邮件 收件人和发件人 消息 我想让用户选择发送电子贺卡的日期 如何在特定日期发送电子贺卡 我需要编写一个每天运行的脚本吗 怎么做
  • 带有角度的 requirejs - 不解决嵌套路由的控制器依赖关系

    The RequireJS当路由具有多个级别时 无法正确解决依赖关系 如下所示http www example com profile view 如果我有http www example com view 控制器依赖性已正确解决 我的 bo
  • python:递归检查以确定字符串是否是回文

    我的任务是定义一个过程 is palindrome 它将字符串作为输入 并返回一个布尔值 指示输入字符串是否是回文 在这种情况下 单个字母应该返回 True 空字符串也应该返回 True 不幸的是 我没有得到预期的结果 我很感激你的帮助 我
  • 修改 PhaseListener 中的 JSF 组件树

    我有一个问题 我已经实现了一个 PhaseListener 它的目的是向树中附加有消息的任何 UIInput 组件添加一个样式类 如果没有附加任何消息 则删除该样式类 PhaseListener 在 RENDER RESPONSE 阶段运行
  • ST2 键盘映射:“expand_selection”的参数

    有谁知道如何在 Sublime Text 2 中编辑 expand selection 键盘映射 以便它只选择当前行而不是后面的换行符 默认的键盘映射是这样的 keys ctrl l command expand selection arg
  • Android:尝试 HttpURLConnection.getOutputStream() 时抛出 SocketException

    这是我的第一个 Android 程序 它是一个修改后的 hello world 我在 MAC 上的模拟器上运行它 我尝试与 NET Web 服务通信 但出现异常connection getOutputStream 我可以从模拟器访问该网站
  • scanf() 可变长度说明符

    如何使用变量来指定最大字符数scanf 应该读进去吗 例如使用printf 你可以像这样使用 define MAXVAL 5 printf Print at maximum MAXVAL chars s n MAXVAL myStringH
  • JS ES6 通过键数组过滤对象的正确方法

    我想获取一个对象数组并过滤每个对象以仅返回键与数组中的项目匹配的属性 例如 const myKeys key 1 key 3 const myArray key 1 Some Value A key 2 Some Other Value A
  • jqgrid 搜索弹出窗口允许删除所有过滤器!

    我正在 JqGrid 上尝试非常简单的搜索弹出窗口 请参阅下面的代码 有几个问题 The popup comes up with AND OR and controls at the very top See screenshot belo
  • pandas to_csv输出引用问题

    我在获取熊猫时遇到了麻烦dataframe to csv 输出正确的引用字符串 import pandas as pd text this is out text df pd DataFrame index 1 columns 1 2 df
  • 是否可以使用 OpenGL 以 RGB888 进行渲染?

    我在各种设备上的 Android 上玩过一段时间的 OpenGL 除非我错了 否则默认渲染始终使用 RGB565 像素格式执行 不过 我想使用 RGB888 渲染更准确的颜色 The GL表面视图文档提到了两种与像素格式相关的方法 the
  • 由于 Web API 中的特殊字符,未设置 Post 值

    我正在尝试向我的 Web api 服务发布帖子 重点是 在发送类似消息时 message it is done 工作正常 但是 当我在消息中使用 p 等特殊字符时 它无法转换我的 json 因此 post 对象保持为空 我能做些什么 这要么
  • 在 SAS 中导入时删除列中的空格

    我有一个 CSV 文件 我想将其导入 SAS 但 CSV 的列名有空格 例如 其中一列是 国家 地区代码 我想删除删除空格并将 放在该位置 以便列名称变为 Country Code 任何帮助 我如何使用 SAS 代码来做到这一点 如果它是
  • Rails 中嵌入的 ruby​​ 语法“<%= .. %>”[重复]

    这个问题在这里已经有答案了 我对以下有关 ERB 模板的想法是否正确 任何建议将不胜感激 带有等号 的嵌入式 ruby 语法是否旨在渲染某些输出 而没有等号 的则不然 当你使用您将表达式值渲染到输出中 尽管只是简单地写一些Ruby不会呈现为
  • 将 JVM/JRE 设置为自动使用 Windows 代理

    我确实看到了有关为 JVM 设置代理的问题 但我想问的是如何利用已经配置的代理 在 Windows 上 这是我的问题的演示 转到控制面板 gt Java 并设置代理地址 运行以下简单的小程序代码 我使用的是 Eclipse IDE impo
  • 使用createview和modelform在django中自动将登录用户设置为作者

    我正在构建一个前端表单 允许某人在不访问管理员的情况下发布文章 当用户登录时 我希望他 她能够写一篇文章 保存后 我希望该用户自动设置为文章的作者 我陷入了僵局 任何帮助将非常感激 模型 py from django db import m