簡體   English   中英

Django更新,而不是插入新記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM