これが私の見解です。新しいものを作成して古いものを取得できるように、チェックボックスではなくテキストを介してmanytomanyfieldを追加したいと思います。ユーザーに各言語をスペースで分割してもらいたい
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加