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