[英]Django update instead of insert a new record
我在Django 1.3上遇到了一個奇怪的問題。 當我嘗試使用ActivityForm添加新的Activity時,即使我顯式創建一個沒有ID的新Activity對象,該Activity也會經常更新。
另外,當我的ActivityForm類的初始化具有顯式的trip_id參數時,UI將顯示“選擇有效的選擇。該選擇不是可用選擇之一”。 (即使顯示的選擇有效)。 但是,如果我將此參數設為可選參數並從kwargs彈出它,則不會出現此問題。
有人可以看看下面的代碼,看看我在做什么錯嗎?
表格
class DestinationMultipleChoiceField(ModelMultipleChoiceField):
def label_from_instance(self, obj):
return obj.city_name
class ActivityForm(forms.Form):
description = forms.CharField(max_length=100, required=True)
location = DestinationChoiceField(queryset = Visit.objects.none(), empty_label=None, required=True)
def __init__(self, trip_id = None, *args, **kwargs):
super(ActivityForm, self).__init__(*args, **kwargs)
if trip_id is not None:
self.fields['location'].queryset = Visit.objects.filter(trip=trip_id).all().select_related('destination')
# A new Activity() is created if nothing is provided
def save(self, activity = Activity()):
if not self.is_valid():
raise forms.ValidationError('ActivityForm was not validated first before trying to call save().')
activity.visit = self.cleaned_data['location']
activity.description = self.cleaned_data['description']
activity.added_by = User.objects.get(pk=1)
activity.save()
views.py
def add_activity(request, trip_id = None, template_name = 'edit-form.html'):
if request.POST:
form = ActivityForm(trip_id, request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('views.list_trip'))
else:
form = ActivityForm(trip_id)
return render_to_response(template_name, {
'page_title': 'Add',
'form': form,
}, context_instance=RequestContext(request))
看這行:
def save(self, activity = Activity()):
在Python中,默認參數只計算一次; 因此,當第一次調用save
方法時 ,將創建一個新的Activity
,但隨后的調用將使用該 Activity
。
save
更改為以下內容:
def save(self, activity=None):
if activity is None:
activity = Activity()
# Rest of the method
然后,將在每次調用時創建一個新的Activity
(如果未提供作為參數的調用)。
模型實例是可變的。 因此, 絕不能像在save
那樣將它們用作方法的默認參數。 有一個原因使您在任何文檔或示例中都從未見過。
正如該站點上許多其他問題所述,默認參數是按定義而不是執行來評估的。 因此,每次沒有活動參數的save
調用都將使用最初定義的相同活動。
但是,我不明白為什么您不使用ModelForm,無論如何它都會為您完成大部分工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.