2010-07-02 2 views
1

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

Моя форма:

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> 

ответ

2

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

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

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


UPDATE:
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.

+0

Первое решение ничего не меняет. Все еще обновленные данные не сохраняются. Вторая проблема заключается в том, что в режиме редактирования я не могу отправить экземпляр, поскольку он не является ModelForm. – muntu

+0

У меня есть обновленный вопрос с обоими методами: http://stackoverflow.com/questions/3169274/forms-for-instances-not-saved – muntu

1

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

0

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

0

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

<form action="{% url 'edit' %}" method="post">

Смежные вопросы