2015-11-25 1 views
2

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 %} 

Répondre

1

Votre action est sous forme /update_project/, mais cela ne correspond pas à votre modèle d'URL pour les projets de mise à jour. Au lieu de cela, l'URL correspond à la vue views.profile_page, qui traite update_project en tant que nom d'utilisateur. Cela soulève un 404, puisque vous n'avez pas un utilisateur avec ce nom d'utilisateur.

Si vous supprimez l'attribut action du formulaire, le formulaire sera soumis à la page en cours, ce que je crois être ce que vous voulez.

Sinon, vous pouvez modifier l'action à

action="{% url 'update_project' project_user.username project.slug %}" 

Si vous faites cela, vous devez vous assurer que les variables sont dans le contexte du modèle.

+0

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

+0

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

+0

Merci beaucoup! – ollysmall