Форма не проходит валидацию, пишет, что все поля пусты Django

В представлении у меня есть 3 формы:

forms.py

class PostForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(PostForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Post
        fields = ['subtitle', 'latitude', 'longitude', 'tags', 'body']
        widgets = {
            'body': forms.Textarea(attrs={'class': 'log-body editable'}),
            'tags': forms.TextInput(attrs={'id': 'tags-field', 'class': 'log-form-field'}),
            'latitude': forms.TextInput(attrs={'id': 'latitude-field', 'class': 'log-form-field'}),
            'longitude': forms.TextInput(attrs={'id': 'longitude-field', 'class': 'log-form-field'}),
            'subtitle': forms.TextInput(attrs={'id': 'subtitle-field', 'class': 'log-form-field'}),
        }
        labels = {
            'subtitle': 'Subtitle:',
            'tags': 'Tags:',
            'latitude': 'Latitude',
            'longitude': 'Longitude',
            'body': ''
        }


class ImageForm(forms.ModelForm):
    images = forms.ImageField(label='Images', widget=forms.ClearableFileInput(
        attrs={
            'multiple': True,
            'class': 'file-upload',
            'id': 'file-upload-button-image',
            'name': 'images'}
    )
                              )

    class Meta:
        model = PostImage
        fields = ('images',)


class VideoForm(forms.ModelForm):
    videos = forms.FileField(label='Videos', widget=forms.ClearableFileInput(
        attrs={
            'multiple': True,
            'class': 'file-upload',
            'id': 'file-upload-button-video',
            'name': 'images'
        }
    )
                             )

    class Meta:
        model = PostVideo
        fields = ('videos',)

У меня есть шаблон, который создает пост и сохраняет видео и изображения, и это отлично работает. У меня возникают трудности с обновлением 'Post'.

class PostEditView(TemplateView):
    template_name = 'Logging/edit view.html'
    post_form_class = PostForm
    image_form_class = ImageForm
    video_form_class = VideoForm

    def get_context_data(self, **kwargs):
        context = super(PostEditView, self).get_context_data(**kwargs)
        context['post_pk'] = self.kwargs['pk']
        context['post_form'] = PostForm(instance=Post.objects.get(pk=self.kwargs['pk']))
        context['image_form'] = ImageForm(empty_permitted=True, use_required_attribute=False)
        context['video_form'] = VideoForm(empty_permitted=True, use_required_attribute=False)
        context['images'] = PostImage.objects.filter(post_id=self.kwargs['pk'])
        context['videos'] = PostVideo.objects.filter(post_id=self.kwargs['pk'])
        return context

    def post(self, request, *args, **kwargs):
        context = self.get_context_data()
        post_data = request.POST or None
        if post_data.get('Delete'):
            if len(post_data.getlist('img-index[]')) > 0:
                for i in post_data.getlist('img-index[]'):
                    PostImage.objects.filter(id=i).delete()
            if len(post_data.getlist('vid-index[]')) > 0:
                for i in post_data.getlist('vid-index[]'):
                    PostVideo.objects.filter(id=i).delete()
        print(post_data)
        post_form = PostForm(data=post_data, instance=Post.objects.get(pk=self.kwargs['pk']), prefix='post')
        print(post_form.is_bound)
        post_form.is_valid()
        print(post_form.errors)
        images = request.FILES.getlist('image-images')
        videos = request.FILES.getlist('video-videos')
        if post_form.is_valid():
            print('valid form')
            for i in images:
                instance = PostImage(image=i, post=context['post_pk'])
                instance.save()
            for v in videos:
                instance = PostVideo(video=v, post=context['post_pk'])
                instance.save()

        return super(PostEditView, self).render_to_response(context)

    def form_save(self, form, request):
        obj = form.save(commit=False)
        obj.user = request.user
        obj.author = request.user.first_name + ' ' + request.user.last_name
        obj.event_type = 'Log Entry'
        obj.save()
        messages.success(self.request, "{} posted successfully".format(obj))
        return obj

Когда я вызываю is_valid() на post_form, он всегда говорит false, хотя и говорит, что он связан. Мой объект post действительно содержит данные из формы в моем шаблоне, включая токен csrf, но по какой-то причине форма никогда не является действительной и говорит, что все поля пусты.

от print(post_data):

<QueryDict: {'csrfmiddlewaretoken': ['h5uxuACKsvBcO4lrPB7yKbYgr0BsASEklT3GTp6R3t8na13TadAfjbihl2VyGvdC'], 'subtitle': ['Test with photos'], 'latitude': ['48.000'], 'longitude': ['112.000'], 'tags': ['[]'], 'images': [''], 'videos': [''], 'body': ['<p>body test 2 saa</p>']}> из print(post_form.is_bound):

True

от print(post_form.errors):

<ul class="errorlist">
<li>subtitle<ul class="errorlist"><li>This field is required.</li></ul></li><li>latitude
<ul class="errorlist"><li>This field is required.</li></ul></li><li>longitude
<ul class="errorlist"><li>This field is required.</li></ul></li><li>tags
<ul class="errorlist"><li>This field is required.</li
></ul></li><li>body
<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

Models.py

class Post(models.Model):

    class Status(models.TextChoices):
        active = 'Active'
        inactive = 'Inactive'

    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    author = models.CharField(max_length=255)
    title = models.CharField(max_length=80, default='Log Entry: ' + datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S"))
    subtitle = models.CharField(max_length=255)
    latitude = models.DecimalField(decimal_places=3, max_digits=6)
    longitude = models.DecimalField(decimal_places=3, max_digits=6)
    post_time = models.DateTimeField(auto_now_add=True)
    tags = TaggableManager()
    body = models.TextField()
    history = HistoricalRecords()
    event_type = models.CharField(max_length=50, choices=EventType.choices, default='Log Entry', editable=False)
    status = models.CharField(max_length=10, choices=Status.choices, default='Active')

    def __str__(self):
        return 'Post by: ' + str(self.user) + " on: " + self.post_time.strftime("%m/%d/%Y at %H:%M:%S")


def get_image_filename(instance, filename):
    title = instance.post.title
    slug = slugify(title)
    return "post_media/%s/%s" % (slug, filename)


class PostImage(models.Model):
    post = models.ForeignKey(Post, default=None, on_delete=models.PROTECT)
    image = models.ImageField(upload_to=get_image_filename, verbose_name='Image')

    def filename(self):
        return self.image.name.split('/')[-1]


class PostVideo(models.Model):
    post = models.ForeignKey(Post, default=None, on_delete=models.PROTECT)
    video = models.FileField(upload_to=get_image_filename, verbose_name='Video')

    def filename(self):
        return self.video.name.split('/')[-1]

template:

Я не могу разобраться в этом. Любая помощь была бы признательна!

Вернуться на верх