Django - "缺少1个必要的位置参数:' self' "上传图片时出错

时间:2016-10-21 13:23:11

标签: python django django-models django-views

通过上传带有帖子的图片,我非常接近制作完整的博客。但是我碰到了一堵墙而无法前进,因为我无法正确地让视图和模型正常工作以上传图片。

我得到的错误。

TypeError at /new/
save() missing 1 required positional argument: 'self'
Request Method: POST
Request URL:    http://127.0.0.1:8000/new/
Django Version: 1.9.8

我的模特课。

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length = 200)
    text = models.TextField()
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')
    created_date = models.DateTimeField(default = timezone.now)
    published_date = models.DateTimeField(blank = True, null = True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()
    def __str__(self):
        return self.title

形式。

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('title' ,'text','docfile',)

查看。

def new_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = PostForm.save(commit = False)
            post.docfile = request.FILES["docfile"]
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk = post.pk)
    else:
        form = PostForm()
    return render(request, 'core/post_edit.html', {'form' : form})

HTML模板

{% extends 'core/main.html' %}
{% block content %}

<h1>New Post</h1>
    <form method="POST" class="post-form" enctype="multipart/form-data">{% csrf_token %}
        {{form.as_p}}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>

{% endblock %}
我很近,但我无法弄清楚我错在哪里。 帮助

2 个答案:

答案 0 :(得分:1)

而不是

def new_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = PostForm.save(commit = False)

def new_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)

问题是你创建了PostForm类的新实例。相反,使用已创建的。

答案 1 :(得分:0)

除了上一个答案中提到的错误之外,您不必在视图中手动设置docfile属性,表单会自动将文件保存到{{1}指定的位置参数(参见https://docs.djangoproject.com/es/1.10/ref/models/fields/#django.db.models.FileField.upload_to)。

如果您想手动设置文件,这将是正确的方法(请参阅https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.fields.files.FieldFile.save):

upload_to

如果要立即保存,请省略save参数。