Как я могу создать пользовательскую проверку в django формах модели - PullRequest
0 голосов
/ 15 января 2020

Я хочу создать пользовательскую проверку формы в Django формах. Я могу сделать это в обычных Django формах, но не могу сделать это в модельных формах. мой Django код формы

class Post_Article(forms.Form):
    title = forms.CharField(label = 'Title',max_length = 100)
    abstract = forms.CharField(widget = forms.Textarea, max_length = 300)
    body = forms.CharField(widget = forms.Textarea)
    image = forms.ImageField(required = False)
    hash_tags = forms.CharField(max_length = 50,required = False)

    def no_of_hash_tags(self):
        cleaned_data = super().no_of_hash_tags()
        tags = cleaned_data.get('hash_tags')

        if tags:
            tags = split(str(tags))
            if len(tags) > 5:
                raise forms.ValiadationError('Maximum 5 tags are allowed')

модель Django

class PostsArticle(models.Model):
    title = models.CharField(max_length=255)
    pub_date = models.DateTimeField(default= timezone.now)
    abstract = models.TextField()
    body = models.TextField()
    image = models.ImageField(upload_to=('images/'),blank=True)
    user = models.ForeignKey(User , on_delete = models.CASCADE)
    hash_tags = models.CharField(max_length = 50,blank=  True)

    def _str_(self):
        return self.title

    def get_absolute_url(self):
        return reverse('home')

    def summary(self):
        return self.absract[:200]

    def pub_date_pretty(self):
        return self.pub_date.strftime('%b %e %Y')

    def link_tags(self):
        cleaned_data = super().link_tags
        tags = cleaned_data.get['hash_tags']

        for tag in tags:
            hashing(tag,"PostsArticle")



После некоторого обсуждения переполнения стека я обновляю мои Django формы до

class Post_Article(forms.ModelForm):
    title = forms.CharField(label = 'Title',max_length = 100)
    abstract = forms.CharField(widget = forms.Textarea, max_length = 300)
    body = forms.CharField(widget = forms.Textarea)
    image = forms.ImageField(required = False)
    hash_tags = forms.CharField(max_length = 50,required = False)

    class Meta:
        model = PostsArticle
        fields=("title", "abstract", "body", "image", "hash_tags")

        def clean(self)
        :
         cleaned_data=super(Post_Article, self).clean()
         tags = cleaned_data.get("hash_tags")
         if tags:
            tags = split(str(tags))
            if len(tags) > 5:
                raise forms.ValidationError('Maximum 5 tags are allowed')
         return cleaned_data

Теперь я не могу понять, как я могу использовать его с моим текущим классом, используемым в views.py

class FeedUpdateView(LoginRequiredMixin, UserPassesTestMixin , UpdateView):
    model = FeedPosts
    fields= ['body', 'image']
    template_name= 'post/edit_Feed.html'


    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        Posts = self.get_object()
        if self.request.user == Posts.user:
            return True
        return False

Я хочу использовать мой код форм Django вместо создания представления из моей модели непосредственно. Я хочу сделать это, потому что я хочу иметь некоторую пользовательскую проверку поля, как указано в моем коде форм

, помогите, как я могу добавить проверку формы в мою модель

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Очистка указанного атрибута поля c, вам нужно будет вызвать clean_<field_name>.

class Post_ArticleForm(ModelForm):
    class Meta:
        model = PostsArticle
        fields = ['abstract', 'title', 'body', 'image', 'hash_tags']

    def clean_hash_tags(self):
        cleaned_data = super().clean_hash_tags()
        tags = self.cleaned_data.get('hash_tags')
        if tags:
            tags = split(str(tags))
            if len(tags) > 5:
                raise forms.ValiadationError('Maximum 5 tags are allowed')
        return cleaned_data
0 голосов
/ 15 января 2020

чистая функция не вызывается Django формы -

class Post_Article(forms.ModelForm):
    title = forms.CharField(label = 'Title',max_length = 100)
    abstract = forms.CharField(widget = forms.Textarea, max_length = 300)
    body = forms.CharField(widget = forms.Textarea)
    image = forms.ImageField(required = False)
    hash_tags = forms.CharField(max_length = 50,required = False)

    class Meta:
        model = PostsArticle
        fields=("title", "abstract", "body", "image", "hash_tags")

        def clean(self):
            print(hello)
            cleaned_data=super(Post_Article, self).clean()
            tags = cleaned_data.get("hash_tags")
            if tags:
              tags = split(str(tags))
              if len(tags) > 5:
                raise forms.ValidationError('Maximum 5 tags are allowed')
            return cleaned_data

чистая функция не вызывается

вид формы для этого же

class PostCreateView(LoginRequiredMixin,FormView):
    form_class = Post_Article
    template_name= 'post/post.html'
    success_url =  '/'

    def form_valid(self, form):
        form.instance.user = self.request.user
        print(form.instance.user)
        return super().form_valid(form)

formview находится в views.py

0 голосов
/ 15 января 2020

Вам необходимо переопределить метод clean для вашего ModelForm.

Пример:

class Post_Article(forms.ModelForm):
    ...
    hash_tags = forms.CharField(max_length = 50,required = False)
    ...

    class Meta:
        model = PostsArticle
        fields=("title", "abstract", "body", "image", "hash_tags",)

    def clean(self):
        cleaned_data=super(Post_Article, self).clean()
        tags = cleaned_data.get("hash_tags")
        if tags:
            tags = split(str(tags))
            if len(tags) > 5:
                raise forms.ValidationError('Maximum 5 tags are allowed')
        return cleaned_data
...