我正在使用以下字段制作图片发布表单:标题,描述,图像文件以及公共或非布尔值。我遇到的问题是它什么也没做。它似乎发布,因为我可以在开发服务器控制台中看到它,但后来什么都没有,媒体/照片中没有图像,数据库中也没有任何东西......奇怪的是当我从django管理页面创建一个Image对象时,它工作得很好。所以它必须在视图或模板中,但我可能是错的。这是代码:
<!--The template-->
{% if user.is_authenticated %}
<h1>Ajouter une image</h1>
<h2>Deconnexion:</h2><a href="/Gallery/Disconnect/">Ici</a>
<p>
<form method="post" enctype="multipart/form-data" action=".">
{% csrf_token %}
<p><label for="id_titre">Titre:</label>
<input id="id_titre" type="text" name="Titre" maxlength="100" /></p>
<p><label for="id_description">Description:</label>
<textarea name="Description" id="id_description" ></textarea></p>
<p><label for="id_i">Image:</label>
<input type="file" name="Image" id="id_i" /></p>
<p><label for="id_public"><input type="checkbox" name="public" id="id_public"/>Public <!-- Attention, Internet est un lieu public, meme si cette case n'est pas cochée, votre image devient publique une fois postée. elle ne sera cependant pas affichée dans la gallerie aleatoire ou dernieres images. -->
</label></p>
<input type="submit"/>
</form>
</p>
{% if sauvegarde %}
<p>Image saved.</p>
{% endif %}
{% else %}
<h1>Connect</h1>
{% if error %}
<p><strong>wrong password, or user does not exist, sorry</strong></p>
{% endif %}
<form method="post" action=".">
{% csrf_token %}
<p><label for="id_username">Username:</label>
<input id="id_username" type="text" name="username" maxlength="30" /></p>
<p><label for="id_password">Password:</label>
<input id="id_password" type="password" name="password" maxlength="30" /></p>
<input type="submit"/>
</form><h1>Or Register <a href="/Gallery/Register/">here</a></h1>
{% endif %}
观点:
#The view
def Publish(request):
reg = False
sauvegarde = False
if request.user.is_authenticated():
if request.method == "POST":
form = ImagePublish(request.POST, request.FILES)
if form.is_valid():
pic = Image()
pic.titre = form.cleaned_data["titre"]
pic.description = form.cleaned_data["description"]
pic.i = form.cleaned_data["i"]
pic.public = form.cleaned_data["public"]
pic.save()
sauvegarde = True
else:
form = ImagePublish(request.POST, request.FILES)
else :
if request.method == "POST":
form = ConnexionForm(request.POST)
if form.is_valid():
username = form.cleaned_data["username"] # Nous récupérons le nom d'utilisateur
password = form.cleaned_data["password"] # … et le mot de passe
user = authenticate(username=username, password=password) #Nous vérifions si les données sont correctes
if user: # Si l'objet renvoyé n'est pas None
login(request, user) # nous connectons l'utilisateur
else: #sinon une erreur sera affichée
error = True
else:
form = ConnexionForm()
return render(request, 'Publier.html',locals())
表格:
#The form
class ImagePublish(forms.Form):
titre = forms.CharField(max_length=100)
description = forms.CharField(widget=forms.Textarea)
def clean_content(self):
if content != None:
content = self.cleaned_data['content']
content_type = content.content_type.split('/')[0]
if content_type in settings.CONTENT_TYPES:
if content._size > int(settings.MAX_UPLOAD_SIZE):
raise forms.ValidationError(_(u'Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
else:
raise forms.ValidationError(_(u'File type is not supported'))
return content
public = forms.BooleanField(required=False)
就是这样,我可以添加你需要的代码的任何其他部分,一切都是导入的,我也想指出我没有错误的事实,我设置的信息就像“酷,图片上传”没有出现,如果这可以向任何人展示良好的方向......
答案 0 :(得分:0)
您没有在GET请求中使用django表单将空表单呈现为html。像这样,
获取请求:
form = ImagePublish()
return render(request, 'Publier.html',locals())
django模板Publier.html
<form method="post" enctype="multipart/form-data" action=".">
{% csrf_token %}
{{ form }}
</form>
然后提交表格是邮寄请求,
if request.method == "POST":
form = ImagePublish(request.POST, request.FILES)
if form.is_valid():
form.save()
forms.py:
from .models import Image
class ImagePublish(forms.ModelForm): # This is my change
class Meta:
model = Image
def clean_content(self):
if content != None:
content = self.cleaned_data['content']
content_type = content.content_type.split('/')[0]
if content_type in settings.CONTENT_TYPES:
if content._size > int(settings.MAX_UPLOAD_SIZE):
raise forms.ValidationError(_(u'Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
else:
raise forms.ValidationError(_(u'File type is not supported'))
return content
答案 1 :(得分:0)
如果您要从管理员添加内容,那么您必须拥有模型。在这种情况下,您需要使用ModelForm
表单并使用@dhana的方法,而不是手动执行(管理界面通过ModelForm afaik完成。
您可能希望使用{{form}}
并呈现{{ form.non_field_errors }}
之类的错误。这样你就可以看出出了什么问题。
您可能希望从一个简单的表单开始(没有所有验证代码)。
答案 2 :(得分:0)
我刚刚解决了我的问题,实际上这是一个没有用连接用户填充自己的导演字段,因此它没有验证原因是它是空的而且图像没有发布。我刚刚添加了#34; pic.auteur = request.user&#34;在我看来,它做到了。如果您需要,只需询问,我就会发布新代码!再见