python - Django 表单错误:- 语
- 输入值列表。
- 输入值列表。
问题描述
这是我的观点。我想通过文本而不是复选框添加一个多字段,以便我可以创建新字段并获取旧字段。我希望用户只用空格分隔每种语言
class CreateBooksView(LoginRequiredMixin,CreateView):
login_url = "/books/login"
form_class = CreateBooksForm
template_name = "books/create.html"
success_url = reverse_lazy('home')
def form_valid(self,form):
tag_list=[]
books = form.save(commit=False)
books.author = self.request.user
tags = form.cleaned_data['language']
print(tags)
tag_list=[Language.objects.get_or_create(name=tag)[0] for tag in
tags.split()]
for tag in tag_list:
a = books.language.add(tag)
books.language = a
books.save()
return super(CreateBooksView,self).form_valid(form)
def form_invalid(self,form):
print (form.errors)
return super(CreateBooksView,self).form_invalid(form)
from django import forms
from books.models import Book
class CreateBooksForm(forms.ModelForm):
class Meta:
model = Book
fields = "name","about","language","image"
widgets = {
'language': forms.Textarea(attrs={'cols': 80, 'rows': 2}),
这是我的模型。所以我想要过滤的 ManytoManyField 是语言。
class Language(models.Model):
name= models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
name=models.CharField(max_length=200)
about =models.TextField()
image = models.ImageField(upload_to=upload_image)
language = models.ManyToManyField(Language,related_name='book')
author = models.ForeignKey(User,on_delete=models.PROTECT,related_name='bauthor')
def __str__(self):
return self.name
class Meta:
ordering = ('-pk',)
解决方案
您的语言字段ModelForm
需要一个 id 列表而不是字符串。我的建议是从您的语言字段中取出ModelForm
并添加一个非模型字段来处理标签。
#forms.py
class CreateBooksForm(forms.ModelForm):
tags = forms.CharField(widget=forms.Textarea(attrs={'cols': 80, 'rows': 2}))
class Meta:
model = Book
fields = "name","tags", "about","image"
然后处理视图中的标签
...
def form_valid(self,form):
tag_list=[]
books = form.save(commit=False)
books.author = self.request.user
tags = form.cleaned_data['tags']
books.save() # must be save before adding m2m
tag_list=[Language1.objects.get_or_create(name=tag)[0] for tag in tags.split()]
for tag in tag_list:
a = books.language.add(tag)
books.save()
return super(CreateBooksView,self).form_valid(form)
推荐阅读
- angular - 两个数组。如果第一个数组对象值中的一个为真,那么第二个数组将显示一些对象,如果它为假,则显示另一个对象
- wsh - 如何停止失控的 wscript 命令?
- javascript - 调试器表明它不是函数
- webrtc - 为什么有 WebRTC 时我们需要 crossbar.io (WAMP)?
- powershell - 是否可以阻止 PowerShell 模块在低于 Windows 8 的系统上运行?
- python - 我可以将多个 keras 神经网络模型保存/加载到一个 .h5 文件中吗?
- sql - Oracle SQL Developer 中日期格式的正确语法是什么
- python - 如何从单元测试跟踪在 Python shell 中运行的脚本的代码覆盖率?
- filter - 如何过滤组中的最小不同值?
- ios - AudioKit/DSP:了解磁盘上与内存中未压缩音频大小之间的差异