Mar*_*tin 1 python django django-models django-forms
我对Django 1.3有一个奇怪的问题.当我尝试使用ActivityForm添加新的Activity时,即使我显式创建一个不是Id的新Activity对象,Activity也经常更新.
此外,当我的ActivityForm类的init具有显式trip_id参数时,UI将显示"选择有效选项.该选项不是可用选项之一".对于字段位置(即使显示的选择有效).但是,如果我将它设为可选参数并从kwargs中弹出它,我就不会看到这个问题.
有人可以看看下面的代码,看看我做错了什么?
forms.py
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()
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
看看这一行:
def save(self, activity = Activity()):
Run Code Online (Sandbox Code Playgroud)
在Python中,默认参数被评估一次; 因此,当第一次save调用该方法时,Activity将创建一个new ,但后续调用将使用该方法 Activity.
换成save这样的东西:
def save(self, activity=None):
if activity is None:
activity = Activity()
# Rest of the method
Run Code Online (Sandbox Code Playgroud)
然后,Activity将在每次调用时创建一个new (如果没有提供一个参数).
| 归档时间: |
|
| 查看次数: |
1806 次 |
| 最近记录: |