Comme le titre l'indique, j'ai du mal à faire fonctionner UpdateView. Lorsque j'appuie sur Enregistrer le formulaire ne sauvegarde pas et j'obtiens une erreur 404 avec le message Aucun utilisateur ne correspond à la requête donnée. J'ai vraiment du mal à trouver ce travail et j'ai passé des heures à regarder des exemples en ligne, mais je n'arrive toujours pas à comprendre où je me trompe! Si vous pouviez faire la lumière sur ce sujet, ce serait apprécié! Pour clarifier, je veux que mon utilisateur puisse éditer son projet, et seulement cet utilisateur peut le modifier. Je soupçonne que je pourrais faire plusieurs choses mal!UpdateView ne sauvegarde pas le formulaire et j'obtiens une erreur 404 après avoir appuyé sur la touche de sauvegarde
urls
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^register_profile/$', views.register_profile, name='register_profile'),
url(r'^update_profile/$', views.update_profile, name='update_profile'),
url(r'^create_project/$', login_required(views.CreateProject.as_view()), name='create_project'),
url(r'^update_project/(?P<username>\w+)/(?P<slug>[-\w]+)/$', login_required(views.UpdateProject.as_view()), name='update_project'),
url(r'^(?P<username>\w+)/$', views.profile_page, name='user_profile'),
url(r'^(?P<username>\w+)/(?P<slug>[-\w]+)/$', views.project_page, name='user_project'),
)
vues
class UpdateProject(UpdateView):
model = UserProject
form_class = UserProjectForm
template_name = 'howdidu/update_project.html'
def get_object(self, *args, **kwargs):
obj = super(UpdateProject, self).get_object(*args, **kwargs)
if obj.user != self.request.user:
raise PermissionDenied() #or Http404
return obj
def form_valid(self, form):
userproject = form.save(commit=False)
form.instance.user = self.request.user
userproject.save()
self.object = userproject
return super(UpdateProject, self).form_valid(form)
def get_success_url(self):
project_username = self.request.user.username
project_slug = self.object.slug
return reverse('user_project', kwargs={'username':project_username, 'slug': project_slug})
modèles
class UserProject(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=100)
project_overview = models.CharField(max_length=1000)
project_picture = models.ImageField(upload_to='project_images', blank=True)
date_created = models.DateTimeField(auto_now_add=True)
project_views = models.IntegerField(default=0)
project_likes = models.IntegerField(default=0)
project_followers = models.IntegerField(default=0)
slug = models.SlugField(max_length=100, unique=True) #should this be unique or not?
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(UserProject, self).save(*args, **kwargs)
def __unicode__(self):
return self.title
modèle project.html
{% extends 'howdidu/base.html' %}
{% load staticfiles %}
{% block title %}Project{% endblock %}
{% block body_block %}
{% if project %}
<h1>{{ project.title }}</h1>
<img src="{{ project.project_picture.url }}" width = "300" height = "300" />
<h3>{{ project.project_overview }}</h3>
<p><a href="{% url 'update_project' project_user.username project.slug %}">Edit project</a></p>
{% else %}
The specified project {{ project.title }} does not exist!
{% endif %}
{% endblock %}
modèle update_project.html
{% extends 'howdidu/base.html' %}
{% load staticfiles %}
{% block title %}Update project{% endblock %}
{% block body_block %}
<h1>Edit your project</h1>
<form enctype="multipart/form-data" id="UserProjectForm" method="post" action="/update_project/">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="submit" value="Save" />
</form>
{% endblock %}
oh mec! Je vous remercie! la quantité de temps que j'ai perdu pour cette erreur stupide! En ce qui concerne la sécurité et en autorisant seulement l'utilisateur du projet à l'éditer, est-ce que je l'ai fait de la bonne manière? – ollysmall
Votre méthode 'get_object' me semble correcte (assurez-vous de bien le tester!). Il peut être préférable de renvoyer 404 si l'utilisateur n'est pas autorisé, car retourner 403 laisse échapper des informations que l'utilisateur existe. – Alasdair
Merci beaucoup! – ollysmall