Формы для экземпляров не сохранены - PullRequest
0 голосов
/ 03 июля 2010

Я пытаюсь создать форму для добавления нового друга / обновления существующего.Мое первое решение использует ModelForm, но данные из обновленной формы не сохраняются .Также проблема в том, что в моей модели есть CharFields ('code', 'pid'), которые мне нужно проверить с помощью regex через мою форму.Если я исключаю эти поля в Meta и добавляю их в FriendForm, при загрузке формы я не получаю там никаких данных.

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',)

Во втором решении используется формы. Форма.Здесь проблема в том, что Я не могу отправить экземпляр в мою форму, поэтому я не могу получить данные для редактирования .Из-за этого я не могу проверить, работает ли мой метод сохранения и лучше ли это решение.

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

Вот мои используемые модели:

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')

Как я могу получитьэто работает?Моя форма для редактирования пользователя (с использованием метода модели) работает без проблем: /

1 Ответ

0 голосов
/ 06 июля 2010

muntu - придерживайтесь варианта 1, даже если над ним нужно немного поработать - это более разумный подход и обеспечивает большую гибкость в будущем.Я думаю, что проблема в поле friend_of на Friend - вы сделали это обязательным полем, поэтому вы не можете сохранить Friend без него, но вы также не предоставляете значение для негов вашем коде.(См. Примечание в электронной документации django .)

Используя эти рекомендации, попробуйте этот код в разделе проверки / сохранения:

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

Просьба комментировать сработает ли это или какие проблемы возникают.

...