如何在我的帖子上使用CreateView上传图像?

时间:2017-07-15 13:59:04

标签: python django post file-upload image-uploading

我遇到了一些问题,我可以上传文字等文字'文字'以及该领域的视频'我在其中放置了一个URLField,问题是从管理面板我可以毫无问题地上传图像。但是在从视图中通过CreateView进行操作时我无法做到。

我被告知要将标签(enctype =" multipart / form-data")添加到表单中并且它可以工作,但不是将其上传到/media/posts/image.jpg而是尝试将其上传到(/ media / image .jpg),结束时它不会上传图片。

我真的只是想将图片上传到我的帖子,你可以在这里看到https://plxapp.herokuapp.com/,然后使用头像和UserProfile的标题进行上传。

如果他们有任何程序或验证应该做,他们可以告诉我。

我留下我的代码:

模板:

        <form action="" enctype="multipart/form-data" method="post">
            {% csrf_token %}
            <div class="form-group">
                <label for="{{ form.subject.id_text }}">Text</label>
                {{ form.text }}
            </div>
            <div class="form-group">
                <label for="{{ form.subject.id_image }}">Image</label>
                {{ form.image }}
            </div>
            <div class="form-group">
                <label for="{{ form.subject.video }}">Video</label>
                {{ form.video }}
            </div>
            <button type="submit" class="btn btn-success">Publish <span class="glyphicon glyphicon-edit" aria-hidden="true"></span></button>
        </form>

views.py:

class PostCreateView(generic.CreateView):
    form_class = PostForm
    success_url = reverse_lazy('timeline')
    template_name = 'posts/post_new.html'

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.user = self.request.user
        obj.date_created = timezone.now()
        obj.save()
        return redirect('timeline')

forms.py:

class PostForm(forms.ModelForm):
    text = forms.CharField(
        widget=forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'What are you thinking?', 'maxlength': '200', 'rows': '3'})
)
    image = forms.CharField(
        widget=forms.FileInput(attrs={'class': 'form-control'}), required=False
)
    video = forms.CharField(
        widget=forms.URLInput(attrs={'class': 'form-control', 'placeholder': 'Youtube, Twitch.tv, Vimeo urls.', 'aria-describedby': 'srnm'}), required=False
)

    class Meta:
        model = Post
        fields = ('text', 'image', 'video')

models.py

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.CharField(max_length=200)
    image = models.ImageField(upload_to='posts', blank=True)
    video = models.URLField(blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-date_created"]

    def __str__(self):
        return "{} {} (@{}) : {}".format(self.user.first_name,self.user.last_name, self.user.username,self.text)

Github(来源): https://github.com/cotizcesar/plaxedpy

1 个答案:

答案 0 :(得分:1)

要向表单添加文件字段,请使用FileField模块中的forms,例如image = forms.FileField()

如果要修改表单内表单字段的小部件,只需将widgets属性添加到Meta类即可。像这样:

class PostForm(Form):
    image = FileField()
    class Meta:
        fields = ('title', 'text')
        widgets = {
            'title': forms.TextInput(attrs={'what': 'ever'}),
             }