通过上传带有帖子的图片,我非常接近制作完整的博客。但是我碰到了一堵墙而无法前进,因为我无法正确地让视图和模型正常工作以上传图片。
我得到的错误。
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 %}
我很近,但我无法弄清楚我错在哪里。
帮助
答案 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参数。