python - 在 CreateView 中从 TextInput 创建一个实例
问题描述
我有一个model.py
文件,其中包含类Author
和Article
. Article
有一个外键引用Author
。我在我的文件中blogCreate
使用表单创建了一个视图。由于in class是一个外键,这意味着作者将从查询集中选择。这意味着标签将被自动使用,而不是我想使用标签,以便我可以创建一个使用输入的实例,而不是从查询集中进行选择。ArticleForm
forms.py
author
Article
Author
select
form
<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>
解决方案
我终于找到了一种方法来做我想做的事,我不知道它的效率如何,但它确实有效。让我知道是否有更好的方法。
表格.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
实例已经存在,则它会创建它。然后我保存并完成。
推荐阅读
- python - 使用 `.groupby().apply()` 而不是 `.groupby().agg()`
- android - 更新 Android 系统 webview 后,Android Webview 不工作
- sql-server - 修复表的过程将 cci 构建为 ci
- python - MSAL Python ConfidentialClientApplication.acquire_token_for_client(scope) 返回没有角色/范围的令牌
- java - Java:用于在另一个字符串中查找子字符串标记的 JPA 搜索规范,也包含标记
- openpdf - 在 openPD 中换行
- python - Django 和 Powershell
- pandas - Pandas 仅在整个 Dataframe 的子集上运行功能
- spacy - 是否可以将自定义实体标签添加到 Spacy 3.0 配置文件?
- flutter - 提供者从 ChangeNotifier 通知其他侦听器