Django 表单错误:<ul 类= "errorlist" ><li>语言<ul 类= "errorlist" ><li>输入值列表。</li&



这是我的视图。我想通过文本而不是复选框添加许多字段,这样我就可以创建新字段和获取旧字段。我希望用户只需用空格拆分每种语言

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)

最新更新