Django ManyToManyField обновляется в админке, но не через форму CreateView (на стороне пользователя) - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь создать функцию тега для сообщения с ManyToManyField в django. Если я добавляю теги через admin, они обновляются должным образом, но через форму createview не обновляются.

Ниже приведен код связанных классов в model.py

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name

class Post(models.Model) :
    title = models.CharField(
            max_length=200,
            validators=[MinLengthValidator(2, "Title must be greater than 2 characters")]
    )

    picture = models.BinaryField(null=True, blank=True, editable=True)
    content_type = models.CharField(max_length=256, null=True, blank=True, help_text='The MIMEType of the file')
    text = models.TextField()
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) #foreign key from django setting

    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
    tags = models.ManyToManyField(Tag, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # Shows up in the admin list
    def __str__(self):
        return self.title

И класс CreateView в view.py

class PostCreateView(LoginRequiredMixin, View):
    template = 'cfis/post_form.html'
    success_url = reverse_lazy('cfis:all')
    def get(self, request, pk=None) :
        form = PostCreateForm()
        ctx = { 'form': form }
        return render(request, self.template, ctx)

    def post(self, request, pk=None) :
        form = PostCreateForm(request.POST, request.FILES or None)

        if not form.is_valid() :
            ctx = {'form' : form}
            return render(request, self.template, ctx)

        # Add owner to the model before saving
        pic = form.save(commit=False)
        pic.owner = self.request.user
        pic.save()
        return redirect(self.success_url)

Lastyl, класс формы в form.py

class PostCreateForm(forms.ModelForm):
    max_upload_limit = 2 * 1024 * 1024
    max_upload_limit_text = naturalsize(max_upload_limit)

    picture = forms.FileField(required=False, label='File to Upload <= '+max_upload_limit_text)
    upload_field_name = 'picture'

    class Meta:
        model = Post
        fields = ['title', 'text', 'category', 'tags']

    # Validate the size of the picture
    def clean(self) :
        cleaned_data = super().clean()
        pic = cleaned_data.get('picture')
        if pic is None : return
        if len(pic) > self.max_upload_limit:
            self.add_error('picture', "File must be < "+self.max_upload_limit_text+" bytes")

    # Convert uploaded File object to a picture
    def save(self, commit=True) :
        instance = super(PostCreateForm, self).save(commit=False)

        if commit:
            instance.save()

        return instance

Может кто-нибудь, пожалуйста, сообщите мне, что мне не хватает? Странно, это работает через Admin, но не в форме пользователя.

...