2014-11-12 12 views
1

Как я уже говорил в названии: ЭкземплярДжанго экземпляра изменение формы атрибута перед сохранением

def profile(request, template='/member/profile.html'): 

    ..... 

    member = get_object_or_404(Member, id=id) 

    # >>> member.qrcode 
    # <ImageFieldFile: upload/qrcode/2014-11-12/99_1.41578387725e12.jpg> 


    if request.method == 'POST': 
     form = ProfileForm(request.POST, request.FILES, instance=member) 

     # >>> member.qrcode 
     # <ImageFieldFile: 20140901192104.png> 

     if form.is_valid(): 
      member = form.save(commit=False) 
..... 

Форма member изменить сразу после form = ProfileForm(request.POST, request.FILES, instance=member).
Потому что я хочу сохранить элемент только тогда, когда member.type == 1 и изменить какое-либо поле в соответствии с результатом сравнения некоторых данных в member и form.cleaned_data.

Я думаю, что очень плохо изменить атрибут member перед тем, как позвонить form.save().
Как его изменить?

ответ

0

Если вы вызываете save() с commit = False, то он вернет объект, который еще не сохранен в базе данных.

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

member = form.save(commit=False) 
if member.type == 1: 
    member.save() 
+0

Он ничего плохого в таком подходе - это документально. Также в некоторых случаях вы можете использовать 'pre_save' https://docs.djangoproject.com/en/dev/ref/signals/#pre-save где' instance == form.save (commit = False) ' – madzohan

+0

изменение члена экземпляра сразу после 'form = ProfileForm (request.POST, request.FILES, instance = member)', а не 'member = form.save (commit = False)' .member был изменен до 'if form.is_valid():'. – Mithril

+0

нет, он создает объект 'ProfileForm' https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method – madzohan

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