首页 > 解决方案 > 在 CreateView 中从 TextInput 创建一个实例

问题描述

我有一个model.py文件,其中包含类AuthorArticle. Article有一个外键引用Author。我在我的文件中blogCreate使用表单创建了一个视图。由于in class是一个外键,这意味着作者将从查询集中选择。这意味着标签将被自动使用,而不是我想使用标签,以便我可以创建一个使用输入的实例,而不是从查询集中进行选择。ArticleFormforms.pyauthorArticleAuthorselectform<input type="text" >Author

表格.py

from django import forms
from .models import Article


class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ('title', 'content', 'aurthor')
        widgets = {
            'title': forms.TextInput(attrs={
                'class': 'title'}),
            'content': forms.Textarea(attrs={
                'class': 'text_input',
                'name': 'article_content'}),
            # Changed to TextInput so it can use <input type="text" >
            'aurthor': forms.TextInput(attrs={
                'class': 'text_input',
                'name': 'aurthor_name'})
        }

模型.py

from django.db import models
from ckeditor.fields import RichTextField


class Aurthor(models.Model):
    name = models.CharField("Author Name", max_length=100)
    def __str__(self):
        return self.name


class Article(models.Model):
    title = models.CharField("Title", max_length=100)
    content = RichTextField(blank=True, null=True)
    pub_date = models.DateTimeField("Publish Date", auto_now_add = True)
    aurthor = models.ForeignKey(Aurthor, on_delete=models.CASCADE)
    def __str__(self):
        return self.title

视图.py


from .models import Article, Aurthor
from django.views.generic import CreateView
from .forms import ArticleForm


class blogCreate(CreateView):
    model = Article
    form_class = ArticleForm
    template_name = 'BlogHandler/blog.html'

博客.html

 <form action="" method="post">
        {% csrf_token %}
        {{form.as_p}}
        <button type="submit">Post</button>
    </form>

标签: pythondjango

解决方案


我终于找到了一种方法来做我想做的事,我不知道它的效率如何,但它确实有效。让我知道是否有更好的方法。

表格.py

from django import forms
from .models import Article, Author


class ArticleForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ArticleForm, self).__init__(*args, **kwargs)
        self.fields['author'] = forms.CharField(max_length=100, required=True)# author is required
    class Meta:
        model = Article
        fields = ('title', 'content', )

在问题中,我说我已将作者的小部件更改为,TextInput以便我可以输入文本而不是Author. 这不是我想要的方式,所以我删除author并创建了一个自定义fields字段author不是我模型中的字段。这样我仍然可以获得文本输入来创建我的Author实例。

模型.py

class Article(models.Model):
    title = models.CharField("Title", max_length=100, null=False)
    content = RichTextField(blank=True, null=False)
    pub_date = models.DateTimeField("Publish Date", auto_now_add = True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True)

author在我的文件中设置了可空值,models.py但这没关系,因为我auhtor在 required 中设置了自定义字段,forms.py以便所有Article使用该站点制作的 s 都有一个Author. 在此更改之前我遇到了一些错误

视图.py

class articleCreate(CreateView):
    model = Article
    form_class = ArticleForm

    def form_valid(self, form):
        rt = super().form_valid(form)
        article = form.save(commit=False)
        author_name = self.request.POST['author'].title()
        author, created = Author.objects.get_or_create(name=author_name)
        article.author = author
        article.save()
        return rt

在这里,我首先暂停保存,以便我可以Author使用来自自定义字段的文本输入创建一个author简单文本,如果Author实例已经存在,则它会创建它。然后我保存并完成。


推荐阅读