Действительная форма Джанго не сохраняется - PullRequest
1 голос
/ 02 июля 2010

На мой взгляд, для редактирования друзей я проверяю правильность формы, а затем сохраняю форму.Но как-то данные не обновляются.Почему моя обновленная форма не сохраняется?Он действителен на 100%, так как я проверял это раньше.

Моя форма:

class FriendForm(forms.ModelForm):
    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 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,
            }, context_instance=RequestContext(request))

Шаблон:

<form method="post" action="." enctype="multipart/form-data">
    <table>           
        {{ form.as_table }}
        <tr>
            <td>&nbsp;</td>
            <td>
                <input type="submit" class="submit" name="submit" value="Save" />
            </td>
        </tr>
    </table>
</form>

Ответы [ 4 ]

3 голосов
/ 02 июля 2010

Мне нужно увидеть полный код вашей формы, чтобы действительно ответить на этот вопрос (можете ли вы включить его?), Но вот несколько начальных мыслей:

Является ли FriendForm подклассом django.forms.ModelForm?Если это так, нет необходимости переопределять метод save - тем более что все, что вы здесь делаете, - это получение возвращенного нового объекта, сохранение его (снова) и его возврат (снова) - дополнительная обработка без каких-либо дополнительных преимуществ.

Если FriendForm не является подклассом ModelForm, как оно связано с данными базы данных?От какого класса оно наследуется?


ОБНОВЛЕНИЕ:
ModelForms не связаны напрямую с базой данных - они представляют собой ярлык для создания форм HTML для взаимодействия с моделями базы данных - то есть классаминаследование от django.models.Model.Вы делаете это, создавая Meta класс внутри вашего ModelForm.

С ModelForm вам не нужно вручную указывать поля (django делает это автоматически), если вы не хотитепереопределить конкретные поведения.Вы do должны указать django, какую модель базы данных вы хотите использовать.Если вы уже определили базу данных Model, используйте ее;если нет, попробуйте это:

# in models.py
from django import models

class Friend(models.Model):
    first_name = models.CharField( "see <http://docs.djangoproject.com/en/dev/ref/models/fields/> to adjust your syntax" )
    ... your other fields ...


# in forms.py
from django.forms import ModelForm
from my_project.my_app.models import Friend

class FriendForm(ModelForm):
    class Meta:
        model = Friend

Вот и все!Теперь ваш FriendForm должен работать правильно.См. http://docs.djangoproject.com/en/dev/topics/forms/modelforms/ для получения дополнительной информации об использовании ModelForm s.

В качестве альтернативы вам вообще не нужно использовать ModelForm.Вы можете добавить следующий save метод к существующему FriendForm:

def save(self):
    if self.is_valid():
        from myproject.myapp.models import Friend
        new_friend = Friend(**self.cleaned_data)
        new_friend.save()
        return new_friend

... суть здесь в том, что вы импортируете модель Friend, которая инкапсулирует поведение хранилища базы данных.Это в основном то, что ModelForm создает автоматически для вас, но не так надежно - поэтому я рекомендую использовать ModelForm.

1 голос
/ 14 ноября 2013

иногда, если вы добавляете декораторы, такие как @action.commit_on_success, во время разработки, это предотвращает сохранение формы, если есть хотя бы одна ошибка.

0 голосов
/ 06 октября 2016

Возможно, вам следует установить атрибут действия для тега формы.

Как и <form action="{% url 'edit' %}" method="post">

0 голосов
/ 21 сентября 2014

Я думаю, что вы можете переопределять поля модели этими полями формы. отметьте это . Обычно, когда у вас есть форма модели, все, что вам нужно сделать, это определить мета-класс и передать дополнительные параметры, необходимые для этой конкретной формы (отображаемые поля, их виджеты, их метки и т. Д.).

...