Vous n'êtes pas identifié(e).
Bonjour à tous !
Je suis confronté à un problème que je n'arrive pas à régler. J'ai réalisé un script qui me permet d'éditer une réponse mais, elle m'ajoute une nouvelle entrée au lieu de me la mettre à jour et pour tout vous dire, je ne comprends absolument pas pourquoi.
@login_required
def edit_answer(request, thread_id = None, message_id = None):
thread = Thread.objects.get(thread = thread_id)
answer = get_object_or_404(Message, pk = message_id)
if not request.user.is_superuser or answer.author.id is not request.user.id:
return HttpResponseForbidden(u'Vous n\'avez pas accès à cette page')
if request.method == 'POST':
form = MessageForm(data=request.POST)
if form.is_valid():
answer.content = form.cleaned_data['content']
answer.save()
return HttpResponseRedirect(reverse('forums.views.thread', args=(thread_id)))
else:
form = MessageForm(instance=answer)
return render_to_response('forums/add_answer.html', {'form': form, 'thread': thread}, context_instance = RequestContext(request))
Pourriez-vous m'apporter une petite aide ?
Merci :)
Hors ligne
j'essaye de répondre...
une logique plus "standard" du point de vue de la doc :
if request.method == 'POST':
form = MessageForm(request.POST,instance=answer) #sans data = ...
if form.is_valid():
form.save()
#et on touche pas en direct au cleaned_data
Dernière modification par quinode (26-01-2011 19:13:56)
Hors ligne
Crois bien que j'eue déjà essayé... Le problème, c'est qu'après, je vais devoir mettre à jour un champ pour l'édition mais il m'en ajoute toujours, jamais de mise à niveau.
Voici ma fonction complète :
@login_required
def edit_answer(request, thread_id = None, message_id = None):
thread = Thread.objects.get(thread = thread_id)
answer = get_object_or_404(Message, pk = message_id)
if not request.user.is_superuser or answer.author.id is not request.user.id:
return HttpResponseForbidden(u'Vous n\'avez pas accès à cette page')
if request.method == 'POST':
form = MessageForm(request.POST, instance = answer)
if form.is_valid():
s = form.save(commit = False)
if request.user.id != s.author.id:
s.user_update = request.user
s.save()
return HttpResponseRedirect(reverse('forums.views.thread', args=(thread_id)))
else:
form = MessageForm(instance=answer)
return render_to_response('forums/add_answer.html', {'form': form, 'thread': thread}, context_instance = RequestContext(request))
Dernière modification par Sh4ke (26-01-2011 19:21:48)
Hors ligne
Essaie de faire un
print type(answer)
juste après ton appel a "get_object_or_404", et si tu vois "Nonetype" c'est que le message_id est pas transmis ou n'est pas le bon, donc verifier les url...
Hors ligne
J'ai comme retour :
<class 'nouweo.forums.models.Message'>
Mon problème est quand j'édite, une nouvelle entrée est ajoutée à la place d'une mise à jour et que je ne comprends pas pourquoi.
Dernière modification par Sh4ke (26-01-2011 19:24:44)
Hors ligne
il trouve donc le message à modifier
pas de raison que le code ci-dessous ne fonctionne pas
if request.method == 'POST':
form = MessageForm(request.POST,instance=answer) #sans data = ...
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('forums.views.thread', args=(thread_id)))
Dernière modification par quinode (26-01-2011 20:04:19)
Hors ligne
Bah, il ne fonctionne pas. Il m'ajoute une entrée au lieu de l'éditer x)
Hors ligne
s.user_update est un simple champ qui est normalement vide. Je te donne mon modèle :
class Message(models.Model):
content = models.TextField(u'Votre message')
posted_at = models.DateTimeField(u'Date de publication', auto_now_add = True)
updated_at = models.DateTimeField(u'Date de modification', blank = True, null = True)
is_hide = models.BooleanField(u'Message censuré', default = 0)
is_delete = models.BooleanField(u'Message supprimé', default = 0)
user_update = models.ForeignKey(User, related_name = 'editor', blank = True, null = True)
author = models.ForeignKey(User, related_name = 'author')
thread = models.ForeignKey(Thread, related_name = 'thread')
class MessageForm(ModelForm):
class Meta:
model = Message
exclude = ('user_update', 'thread', 'author', 'posted_at', 'updated_at')
widgets = {
'content': Textarea(attrs={'cols': 45, 'rows': 13, 'class': 'taille_textarea'}),
}
Cela peut-il provenir de l'utilisation de la version de développement ?
Dernière modification par Sh4ke (26-01-2011 21:19:20)
Hors ligne
Le code de ce post : http://forum.django-fr.org/viewtopic.php?pid=2465#p2465
Me semble correct. Es-tu sur que answer possède bien déjà un ID ?
Hors ligne
Oui, sinon je n'aurais pas pu le récupérer
Même en faisant cela, il n'y a pas d'update :
if form.is_valid():
s = form.save(commit = False)
s.id = 1
if request.user.id != s.author.id:
s.user_update = request.user
s.updated_at = datetime.today()
s.save()
return HttpResponseRedirect(reverse('forums.views.thread', args=(thread_id)))
Si cela peut servir, j'ai cette erreur au bout d'un moment :
Caught NoReverseMatch while rendering: Reverse for 'forums.views.edit_answer' with arguments '(1, 10)' and keyword arguments '{}' not found.
Dernière modification par Sh4ke (26-01-2011 22:11:43)
Hors ligne
Mon problème a été résolu
Merci à tous.
Hors ligne
Le 27/01/2011 13:45, Sh4ke a écrit :
> Mon problème a été résolu
>
> Merci à tous.
Et quel était le problème identifié?
La solution adoptée?
Hors ligne
Le problème était une redirection lors de mon template. Les URLs n'étaient pas correspondantes.
Hors ligne
Le 27 janv. 2011 à 18:27, Sh4ke a écrit :
> Le problème était une redirection lors de mon template. Les URLs
> n'étaient pas correspondantes.
merci pour l'info =^p
Hors ligne