• ,python,django"/>

    首页 > 解决方案 > 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',)
    

    标签: pythondjango

    解决方案


    您的语言字段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)
    

    推荐阅读