2010-07-02 4 views
0

Je suis en train de créer la forme, pour ajouter de nouveaux amis/la mise à jour existante. Ma première solution utilise ModelForm, mais les données du formulaire mis à jour ne sont pas enregistrées. Le problème est aussi que mon modèle a CharFields ('code', 'pid'), que j'ai besoin de valider avec regex à travers mon formulaire. Si j'exclue ces champs dans Meta, et les ajoute à l'FriendForm, lorsque le formulaire est chargé, je n'y reçois aucune donnée.Les formulaires pour les cas non enregistrés

def add_friend(request): 
    userprofile = UserProfile.objects.get(user=request.user) 

    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES,) 
     if form.is_valid(): 
      form.save()    
      next = reverse('user_profile',) 
      return HttpResponseRedirect(next) 
    else: 
     form = FriendForm() 
    return render_to_response('user/data_operations/add_friend.html', { 
      'form':form, 'user':request.user, 
      }, context_instance=RequestContext(request)) 

def edit_friend(request, id): 
    userprofile = UserProfile.objects.get(user=request.user) 
    friend = get_object_or_404(Friend, id=id) 
    if friend.friend_of.id!=userprofile.id: 
     raise Http404 
    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES, instance=friend) 
     if form.is_valid(): 
      form.save()   
     return HttpResponseRedirect(reverse('user_profile',)) 
    else: 
     form = FriendForm(instance=friend) 
    return render_to_response('user/data_operations/edit_friend.html', { 
      'form': form, 'user': request.user, 'friend': friend, 
      }, context_instance=RequestContext(request)) 

class FriendForm(forms.ModelForm):  
    class Meta: 
     model = Friend 
     exclude = ('friend_of',) 

La seconde solution utilise des formulaires. Formulaire. Ici, le problème est que Je ne peux pas envoyer d'instance à mon formulaire, donc je ne peux pas obtenir des données pour éditer. Pour cette raison, je ne suis pas en mesure de vérifier si ma méthode de sauvegarde fonctionne et si cette solution est meilleure.

def add_friend(request): 
    userprofile = UserProfile.objects.get(user=request.user) 
    count = 0 

    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES,) 
     if form.is_valid(): 
      form.save(user=userprofile)    
      next = reverse('user_profile',) 
      return HttpResponseRedirect(next) 
    else: 
     form = FriendForm() 
    return render_to_response('user/data_operations/add_friend.html', { 
      'form':form, 'user':request.user, 
      }, context_instance=RequestContext(request)) 

def edit_friend(request, id): 
    userprofile = UserProfile.objects.get(user=request.user) 
    friend = get_object_or_404(Friend, id=id) 
    if friend.friend_of.id!=userprofile.id: 
     raise Http404 
    if request.method == 'POST': 
     form = FriendForm(request.POST, request.FILES, instance=friend) 
     if form.is_valid(): 
      form.save(user=userprofile)   
     return HttpResponseRedirect(reverse('user_profile',)) 
    else: 
     form = FriendForm() 
    return render_to_response('user/data_operations/edit_friend.html', { 
      'form': form, 'user': request.user, 'friend': friend, 
      }, context_instance=RequestContext(request)) 

class FriendForm(forms.Form): 
    first_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="First name") 
    last_name = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Last name") 
    pid = forms.RegexField(regex=r'^\d{11}', max_length=11 ,widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50))) 
    image = forms.ImageField(label="Image", required=False) 
    street = forms.CharField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=50)), label="Street") 
    number = forms.CharField(widget=forms.TextInput, label="House/flat number") 
    code = forms.RegexField(regex=r'^\d{2}[-]\d{3}', max_length=6, widget=forms.TextInput(attrs=attrs_dict), label="Postal code") 
    city = forms.CharField(widget=forms.TextInput, label="City") 

    def save(self, user): 
     if self.is_valid(): 
      from accounts.models import Friend 
      new_friend = Friend(**self.cleaned_data) 
      new_friend.friend_of = user 
      new_friend.save() 
      return new_friend 

Voici mes modèles utilisés:

class UserProfile(models.Model): 
    (...) 
    user = models.ForeignKey(User, unique=True, related_name='profile')  

class Friend(models.Model): 
    (...) 
    friend_of = models.ForeignKey(UserProfile, related_name='friend_of') 

Comment puis-je obtenir ce travail? Mon formulaire pour l'édition d'utilisateur (en utilisant la méthode du modèle) fonctionne sans aucun problème:/

Répondre

0

muntu - Stick avec l'option 1, même si elle doit être travaillée un peu - c'est une approche plus saine et offre plus de flexibilité vers l'avant. Je pense que le problème est avec le champ friend_of sur Friend - vous avez fait un champ obligatoire, de sorte que vous ne pouvez pas enregistrer un Friend sans elle, mais vous ne fournissez pas de valeur pour dans votre code. (. Voir la note consultative du django online documentation)

En utilisant ces lignes directrices, essayez ce code dans votre section validation/enregistrer:

if form.is_valid(): 
    friend = form.save(commit=False) 
    friend.friend_of = userprofile # (or whatever the user variable is) 
    friend.save() 

Pls commentaire de savoir si cela fonctionne ou quels sont les problèmes venir.

Questions connexes