2010-03-06 5 views
2

Hey, j'ai cherché autour de faire cela (en particulier ce Q: Django edit form based on add form?) mais je ne peux tout simplement pas le faire fonctionner. Le problème que j'ai est que le formulaire crée toujours un nouvel objet, au lieu de modifier l'existant.Comment éditer/ajouter des objets utilisant le même formulaire django?

Voici mon code:

def new_task(request, task_id=None): 

if task_id is not None: 
    task = Task.objects.get(pk=task_id) 
else: 
    task = Task() 

if request.method == 'POST': # If the form has been submitted... 
    form = TaskForm(request.POST, instance=task) 
    if form.is_valid(): 
     form.save(); 
     return tasks(request, 'Task #%s created successfully.' % (task.id)) 
else: 
    form = TaskForm(instance=task) 

return custom_render('user/new_task.html', 
        {'form': form}, 
        request); 

Des indices sur ce que je suis absent? Merci

Modifier: définitions de formulaire ajoutées.

class TaskForm(ModelForm): 

description = CharField(max_length = 1500, 
    widget= forms.Textarea(attrs={'class':'task-description'}), 
    required=True) 

class Meta: 
    model = Task 
+0

Juste pour ajouter plus d'informations, le formulaire est rempli correctement avec les données de l'objet lors de l'édition et il apparaît vide lors de l'ajout d'un nouveau. Tout fonctionne correctement en dehors de ce problème. – Nacho

+0

Avez-vous remplacé la méthode d'enregistrement des formulaires? Pouvez-vous montrer la définition du formulaire? –

+0

Je viens d'ajouter le formulaire def. Non, je n'ai pas écrasé la méthode de sauvegarde ... – Nacho

Répondre

4

Ok, après une bonne nuit de débogage, j'ai découvert quel était le problème. Assez stupide en fait. Le problème était que sur submit, task_id était None.

Je l'ai travaillé par faire:

  1. Sur la forme, j'ai ajouté: <form action="{% url App.myapp.views.new_task **task_id** %}"
  2. Sur mon point de vue j'ajouté:

    retour custom_render ('user/new_task.html', {'form': formulaire, 'submit': submit, 'task_id': task.id}, demande)

C'était tout. Une erreur de débutant. Si quelqu'un sait mieux que moi, je suis ouvert aux suggestions.

+2

Erm - Je * pense * si vous laissez l'attribut action dehors, il retournera simplement à la même URL et la vue récupérera le task_id. – Ryan

+1

La réponse et votre commentaire sont utiles. Je suis allé avec ce que votre commentaire a dit à la fin. – chryss

Questions connexes