Django Ошибка формы: <li>язык <li>Введите список значений. </li></ul></li></ul> - PullRequest
0 голосов
/ 23 февраля 2020

Это мое мнение. Я хочу добавить поле многозначности через текст, а не флажок, чтобы я мог создавать новые и получать старые. Я хочу, чтобы пользователь просто разделял каждый язык пробелом

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',)

1 Ответ

1 голос
/ 23 февраля 2020

Ваше поле языка в вашем ModelForm ожидает список идентификаторов, а не строку. Я бы посоветовал извлечь поле языка из вашего 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...