Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 外键多个图像未保存在django中_Python_Django_Forms_Image - Fatal编程技术网

Python 外键多个图像未保存在django中

Python 外键多个图像未保存在django中,python,django,forms,image,Python,Django,Forms,Image,我正在尝试保存一个包含多个图像的表单。我有两个模型后模型和图像模型。问题是,当我试图上传帖子时,图片没有保存。我可以上传表单中的图像,但当我单击“发布”时,仅保存标题,图像不会保存。有人能告诉我我做错了什么吗 型号.py class Post(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(User, on_delete=models.CASCADE)

我正在尝试保存一个包含多个图像的表单。我有两个模型后模型和图像模型。问题是,当我试图上传帖子时,图片没有保存。我可以上传表单中的图像,但当我单击“发布”时,仅保存标题,图像不会保存。有人能告诉我我做错了什么吗

型号.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
      
class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='media/images/',blank=True, null=True)
class CreatePost(CreateView):
    model = Post
    form_class = Createpost
    template_name = 'add_post.html'

    def get_context_data(self, **kwargs):
        data = super(CreatePost, self).get_context_data(**kwargs)
        data['form_images'] = PostImageFormSet()
        if self.request.POST:
            data['form_images'] = PostImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['form_images'] = PostImageFormSet()
        return data

    def form_valid(self, form):
        form.instance.author = self.request.user
        context = self.get_context_data()
        form_img = context['form_images']
        atc = form.save(commit=False)
        save = atc.save()
        if form_img.is_valid():
            form_img.instance = save
            form_img.save()
        form.save_m2m()
        return super(CreatePost, self).form_valid(form)

    def get_success_url(self):
        return reverse('detail', args=(self.object.id,))
class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        exclude = ()
        widgets = {
           'images': forms.ClearableFileInput(attrs={'multiple':True}),

        }


class CreatePost(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title",]


PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True, #fields=['images'],
)
...
INSTALLED_APPS = [
    ...
    'posts.apps.PostsConfig',
]
...

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.db import models
from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='images/', blank=True, null=True)
from django import forms
from django.forms.models import inlineformset_factory
from .models import Post, Images

class ImageForm(forms.ModelForm):

    class Meta:
        model = Images
        fields = ('images',)
        widgets = {
            'images': forms.ClearableFileInput(attrs={'multiple': True}),
        }

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ["title", ]

PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True,  # fields=['images'],
)
from django.shortcuts import reverse, HttpResponseRedirect
from .models import Post, Images
from django.views.generic import CreateView, DetailView
from .forms import CreatePostForm, PostImageFormSet

class CreatePost(CreateView):
    model = Post
    form_class = CreatePostForm
    template_name = 'posts/add_post.html'
    extra_context = {'form_images': PostImageFormSet()}

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        for key in form.files:
            img_files = form.files.getlist(key)
            for file in img_files:
                Images.objects.create(images=file, article=self.object)
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

    def get_success_url(self):
        return reverse('detail', kwargs={'pk': self.object.id})

class PostDetail(DetailView):
    model = Post
    template_name = 'posts/detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
视图.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
      
class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='media/images/',blank=True, null=True)
class CreatePost(CreateView):
    model = Post
    form_class = Createpost
    template_name = 'add_post.html'

    def get_context_data(self, **kwargs):
        data = super(CreatePost, self).get_context_data(**kwargs)
        data['form_images'] = PostImageFormSet()
        if self.request.POST:
            data['form_images'] = PostImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['form_images'] = PostImageFormSet()
        return data

    def form_valid(self, form):
        form.instance.author = self.request.user
        context = self.get_context_data()
        form_img = context['form_images']
        atc = form.save(commit=False)
        save = atc.save()
        if form_img.is_valid():
            form_img.instance = save
            form_img.save()
        form.save_m2m()
        return super(CreatePost, self).form_valid(form)

    def get_success_url(self):
        return reverse('detail', args=(self.object.id,))
class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        exclude = ()
        widgets = {
           'images': forms.ClearableFileInput(attrs={'multiple':True}),

        }


class CreatePost(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title",]


PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True, #fields=['images'],
)
...
INSTALLED_APPS = [
    ...
    'posts.apps.PostsConfig',
]
...

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.db import models
from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='images/', blank=True, null=True)
from django import forms
from django.forms.models import inlineformset_factory
from .models import Post, Images

class ImageForm(forms.ModelForm):

    class Meta:
        model = Images
        fields = ('images',)
        widgets = {
            'images': forms.ClearableFileInput(attrs={'multiple': True}),
        }

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ["title", ]

PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True,  # fields=['images'],
)
from django.shortcuts import reverse, HttpResponseRedirect
from .models import Post, Images
from django.views.generic import CreateView, DetailView
from .forms import CreatePostForm, PostImageFormSet

class CreatePost(CreateView):
    model = Post
    form_class = CreatePostForm
    template_name = 'posts/add_post.html'
    extra_context = {'form_images': PostImageFormSet()}

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        for key in form.files:
            img_files = form.files.getlist(key)
            for file in img_files:
                Images.objects.create(images=file, article=self.object)
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

    def get_success_url(self):
        return reverse('detail', kwargs={'pk': self.object.id})

class PostDetail(DetailView):
    model = Post
    template_name = 'posts/detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
forms.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
      
class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='media/images/',blank=True, null=True)
class CreatePost(CreateView):
    model = Post
    form_class = Createpost
    template_name = 'add_post.html'

    def get_context_data(self, **kwargs):
        data = super(CreatePost, self).get_context_data(**kwargs)
        data['form_images'] = PostImageFormSet()
        if self.request.POST:
            data['form_images'] = PostImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['form_images'] = PostImageFormSet()
        return data

    def form_valid(self, form):
        form.instance.author = self.request.user
        context = self.get_context_data()
        form_img = context['form_images']
        atc = form.save(commit=False)
        save = atc.save()
        if form_img.is_valid():
            form_img.instance = save
            form_img.save()
        form.save_m2m()
        return super(CreatePost, self).form_valid(form)

    def get_success_url(self):
        return reverse('detail', args=(self.object.id,))
class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        exclude = ()
        widgets = {
           'images': forms.ClearableFileInput(attrs={'multiple':True}),

        }


class CreatePost(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title",]


PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True, #fields=['images'],
)
...
INSTALLED_APPS = [
    ...
    'posts.apps.PostsConfig',
]
...

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.db import models
from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='images/', blank=True, null=True)
from django import forms
from django.forms.models import inlineformset_factory
from .models import Post, Images

class ImageForm(forms.ModelForm):

    class Meta:
        model = Images
        fields = ('images',)
        widgets = {
            'images': forms.ClearableFileInput(attrs={'multiple': True}),
        }

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ["title", ]

PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True,  # fields=['images'],
)
from django.shortcuts import reverse, HttpResponseRedirect
from .models import Post, Images
from django.views.generic import CreateView, DetailView
from .forms import CreatePostForm, PostImageFormSet

class CreatePost(CreateView):
    model = Post
    form_class = CreatePostForm
    template_name = 'posts/add_post.html'
    extra_context = {'form_images': PostImageFormSet()}

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        for key in form.files:
            img_files = form.files.getlist(key)
            for file in img_files:
                Images.objects.create(images=file, article=self.object)
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

    def get_success_url(self):
        return reverse('detail', kwargs={'pk': self.object.id})

class PostDetail(DetailView):
    model = Post
    template_name = 'posts/detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
模板

<form class="post" method="POST" enctype="multipart/form-data" >
        {% csrf_token %}
            {{form.title.label_tag }} {{ form.title }} <br>
            {{ form_images.management_form }}
                {% for form in form_images.forms %}
                    {% for field in form.visible_fields %}
                            {% if forloop.first %}
                                {% for hidden in form.hidden_fields %}
                                    {{ hidden }}
                                {% endfor %}
                            {{ field.errors.as_ul }}
                            {{ field.label_tag }} {{ field }} <br>
                            {% endif %}
                    {% endfor %}
            {% endfor %}
            <br><br>
            <button type="submit" value="post" id="post">Post</button>
        </form>

{%csrf_令牌%}
{{form.title.label_tag}{{form.title}}
{{form_images.management_form}} {form_images.forms%} {%form.visible_fields%} {%if-forloop.first%} {%用于隐藏在表单中。隐藏的_字段%} {{隐藏}} {%endfor%} {{field.errors.as_ul}} {{field.label_tag}{{field}}
{%endif%} {%endfor%} {%endfor%}

邮递

提前感谢。

使用
'images':forms.ClearableFileInput(attrs={'multiple':True})
extra=1
使这个问题不同于处理典型的表单集。当您希望显示同一表单的多个实例时,将使用表单集。在您的问题中,您似乎希望显示一个
ImageField
,并让用户选择多个。如果是这样的话,你甚至不需要表单集

我将提供一个可行的示例,其中formset仅用于呈现表单中的图像字段,用户可以从该字段中选择多个图像。它可以处理
extra=3
,但我不知道为什么有人需要这样做

设置.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
      
class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='media/images/',blank=True, null=True)
class CreatePost(CreateView):
    model = Post
    form_class = Createpost
    template_name = 'add_post.html'

    def get_context_data(self, **kwargs):
        data = super(CreatePost, self).get_context_data(**kwargs)
        data['form_images'] = PostImageFormSet()
        if self.request.POST:
            data['form_images'] = PostImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['form_images'] = PostImageFormSet()
        return data

    def form_valid(self, form):
        form.instance.author = self.request.user
        context = self.get_context_data()
        form_img = context['form_images']
        atc = form.save(commit=False)
        save = atc.save()
        if form_img.is_valid():
            form_img.instance = save
            form_img.save()
        form.save_m2m()
        return super(CreatePost, self).form_valid(form)

    def get_success_url(self):
        return reverse('detail', args=(self.object.id,))
class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        exclude = ()
        widgets = {
           'images': forms.ClearableFileInput(attrs={'multiple':True}),

        }


class CreatePost(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title",]


PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True, #fields=['images'],
)
...
INSTALLED_APPS = [
    ...
    'posts.apps.PostsConfig',
]
...

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.db import models
from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='images/', blank=True, null=True)
from django import forms
from django.forms.models import inlineformset_factory
from .models import Post, Images

class ImageForm(forms.ModelForm):

    class Meta:
        model = Images
        fields = ('images',)
        widgets = {
            'images': forms.ClearableFileInput(attrs={'multiple': True}),
        }

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ["title", ]

PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True,  # fields=['images'],
)
from django.shortcuts import reverse, HttpResponseRedirect
from .models import Post, Images
from django.views.generic import CreateView, DetailView
from .forms import CreatePostForm, PostImageFormSet

class CreatePost(CreateView):
    model = Post
    form_class = CreatePostForm
    template_name = 'posts/add_post.html'
    extra_context = {'form_images': PostImageFormSet()}

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        for key in form.files:
            img_files = form.files.getlist(key)
            for file in img_files:
                Images.objects.create(images=file, article=self.object)
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

    def get_success_url(self):
        return reverse('detail', kwargs={'pk': self.object.id})

class PostDetail(DetailView):
    model = Post
    template_name = 'posts/detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
urls.py(例如,我放入了项目的URL文件)

forms.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
      
class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='media/images/',blank=True, null=True)
class CreatePost(CreateView):
    model = Post
    form_class = Createpost
    template_name = 'add_post.html'

    def get_context_data(self, **kwargs):
        data = super(CreatePost, self).get_context_data(**kwargs)
        data['form_images'] = PostImageFormSet()
        if self.request.POST:
            data['form_images'] = PostImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['form_images'] = PostImageFormSet()
        return data

    def form_valid(self, form):
        form.instance.author = self.request.user
        context = self.get_context_data()
        form_img = context['form_images']
        atc = form.save(commit=False)
        save = atc.save()
        if form_img.is_valid():
            form_img.instance = save
            form_img.save()
        form.save_m2m()
        return super(CreatePost, self).form_valid(form)

    def get_success_url(self):
        return reverse('detail', args=(self.object.id,))
class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        exclude = ()
        widgets = {
           'images': forms.ClearableFileInput(attrs={'multiple':True}),

        }


class CreatePost(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title",]


PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True, #fields=['images'],
)
...
INSTALLED_APPS = [
    ...
    'posts.apps.PostsConfig',
]
...

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.db import models
from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='images/', blank=True, null=True)
from django import forms
from django.forms.models import inlineformset_factory
from .models import Post, Images

class ImageForm(forms.ModelForm):

    class Meta:
        model = Images
        fields = ('images',)
        widgets = {
            'images': forms.ClearableFileInput(attrs={'multiple': True}),
        }

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ["title", ]

PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True,  # fields=['images'],
)
from django.shortcuts import reverse, HttpResponseRedirect
from .models import Post, Images
from django.views.generic import CreateView, DetailView
from .forms import CreatePostForm, PostImageFormSet

class CreatePost(CreateView):
    model = Post
    form_class = CreatePostForm
    template_name = 'posts/add_post.html'
    extra_context = {'form_images': PostImageFormSet()}

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        for key in form.files:
            img_files = form.files.getlist(key)
            for file in img_files:
                Images.objects.create(images=file, article=self.object)
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

    def get_success_url(self):
        return reverse('detail', kwargs={'pk': self.object.id})

class PostDetail(DetailView):
    model = Post
    template_name = 'posts/detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
视图.py

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
      
class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='media/images/',blank=True, null=True)
class CreatePost(CreateView):
    model = Post
    form_class = Createpost
    template_name = 'add_post.html'

    def get_context_data(self, **kwargs):
        data = super(CreatePost, self).get_context_data(**kwargs)
        data['form_images'] = PostImageFormSet()
        if self.request.POST:
            data['form_images'] = PostImageFormSet(self.request.POST, self.request.FILES)
        else:
            data['form_images'] = PostImageFormSet()
        return data

    def form_valid(self, form):
        form.instance.author = self.request.user
        context = self.get_context_data()
        form_img = context['form_images']
        atc = form.save(commit=False)
        save = atc.save()
        if form_img.is_valid():
            form_img.instance = save
            form_img.save()
        form.save_m2m()
        return super(CreatePost, self).form_valid(form)

    def get_success_url(self):
        return reverse('detail', args=(self.object.id,))
class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Images
        exclude = ()
        widgets = {
           'images': forms.ClearableFileInput(attrs={'multiple':True}),

        }


class CreatePost(forms.ModelForm):

    class Meta:
        model = Post
        fields = ["title",]


PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True, #fields=['images'],
)
...
INSTALLED_APPS = [
    ...
    'posts.apps.PostsConfig',
]
...

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.db import models
from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Images(models.Model):
    article = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    images = models.ImageField(upload_to='images/', blank=True, null=True)
from django import forms
from django.forms.models import inlineformset_factory
from .models import Post, Images

class ImageForm(forms.ModelForm):

    class Meta:
        model = Images
        fields = ('images',)
        widgets = {
            'images': forms.ClearableFileInput(attrs={'multiple': True}),
        }

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ["title", ]

PostImageFormSet = inlineformset_factory(
    Post, Images, form=ImageForm,
    extra=1, can_delete=True,  # fields=['images'],
)
from django.shortcuts import reverse, HttpResponseRedirect
from .models import Post, Images
from django.views.generic import CreateView, DetailView
from .forms import CreatePostForm, PostImageFormSet

class CreatePost(CreateView):
    model = Post
    form_class = CreatePostForm
    template_name = 'posts/add_post.html'
    extra_context = {'form_images': PostImageFormSet()}

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        for key in form.files:
            img_files = form.files.getlist(key)
            for file in img_files:
                Images.objects.create(images=file, article=self.object)
        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form):
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

    def get_success_url(self):
        return reverse('detail', kwargs={'pk': self.object.id})

class PostDetail(DetailView):
    model = Post
    template_name = 'posts/detail.html'
    pk_url_kwarg = 'pk'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context
add_post.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      .p-5 {
        padding: 150px;
      }
    </style>
  </head>
  <body>
    <div class="p-5">
      <form class="post" method="POST" enctype="multipart/form-data">
        {% csrf_token %} {{ form.title.label_tag }} {{ form.title }} <br>
        {{ form_images.management_form }}
        {% for form in form_images.forms %}
          {% for field in form.visible_fields %}
            {% if forloop.first %}
              {% for hidden in form.hidden_fields %}
                {{ hidden }}
              {% endfor %}
              {{ field.errors.as_ul }}
              {{ field.label_tag }} {{ field }} <br>
            {% endif %}
          {% endfor %}
        {% endfor %}
        <br><br>
        <button type="submit" value="post" id="post">Post</button>
      </form>
    </div>
  </body>
</html>
{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      img {
        height: auto;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <h1>{{ post.title }}</h1>
    {% for img in post.images_set.all %}
    <div>
      <img src="{{ img.images.url }}" alt="{{ img.name }}">
    </div>
    {% empty %}
      <p>No images</p>
    {% endfor %}
  </body>
</html>

标题
.p-5{
填充:150px;
}
{%csrf\u标记%}{form.title.label\u tag}{{form.title}}
{{form_images.management_form}} {form_images.forms%} {%form.visible_fields%} {%if-forloop.first%} {%用于隐藏在表单中。隐藏的_字段%} {{隐藏}} {%endfor%} {{field.errors.as_ul}} {{field.label_tag}{{field}}
{%endif%} {%endfor%} {%endfor%}

邮递
detail.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      .p-5 {
        padding: 150px;
      }
    </style>
  </head>
  <body>
    <div class="p-5">
      <form class="post" method="POST" enctype="multipart/form-data">
        {% csrf_token %} {{ form.title.label_tag }} {{ form.title }} <br>
        {{ form_images.management_form }}
        {% for form in form_images.forms %}
          {% for field in form.visible_fields %}
            {% if forloop.first %}
              {% for hidden in form.hidden_fields %}
                {{ hidden }}
              {% endfor %}
              {{ field.errors.as_ul }}
              {{ field.label_tag }} {{ field }} <br>
            {% endif %}
          {% endfor %}
        {% endfor %}
        <br><br>
        <button type="submit" value="post" id="post">Post</button>
      </form>
    </div>
  </body>
</html>
{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      img {
        height: auto;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <h1>{{ post.title }}</h1>
    {% for img in post.images_set.all %}
    <div>
      <img src="{{ img.images.url }}" alt="{{ img.name }}">
    </div>
    {% empty %}
      <p>No images</p>
    {% endfor %}
  </body>
</html>
{%load static%}
标题
img{
高度:自动;
宽度:200px;
}
{{post.title}}
{post.images_set.all%中img的百分比}
{%empty%}
没有图像

{%endfor%}
Post的外键真的拼写为“Post”吗?还是拼写错误?只是拼写错误对不起,当我复制到此处时,我想我键入的是错误的。我的问题是否不适合回答?我觉得你的表格逻辑不正确或不合常规。我会在它的顶部放置一个断点,然后逐步查看到底发生了什么。我是django的新手,如何添加断点?天哪,非常感谢@Jarad。你救了我一天:D。我已经试了一百次了。你的代码工作得很好。再次感谢:D