部分应用很酷.什么功能functools.partial提供你无法通过lambdas?
>>> sum = lambda x, y : x + y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
return x + y
>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5
Run Code Online (Sandbox Code Playgroud)
在functools某种程度上更有效,或可读?
我在为内联管理员覆盖查询集时遇到了一些麻烦.
这是一个沼泽标准的父管理员和内联管理员:
class MyInlineAdmin(admin.TabularInline):
model = MyInlineModel
def queryset(self, request):
qs = super(MyInlineAdmin, self).queryset(request)
return qs
class ParentAdmin(admin.ModelAdmin):
inlines = [MyInlineAdmin]
admin.site.register(ParentAdminModel, ParentAdmin)
Run Code Online (Sandbox Code Playgroud)
现在我可以做qs.filter(user=request.user)或qs.filter(date__gte=datetime.today())没有问题.
但我需要的是MyInlineModel实例或ParentAdminModel实例(不是模型!),因为我需要根据它过滤我的查询集.
是否有可能在queryset()方法中获得类似self.instance或obj(如get_readonly_fields()或get_formset())的内容?
希望这是有道理的.任何帮助深表感谢.
我正在使用默认的m2m小部件通过中间模型实现m2m关系。我有Person和Project与使用该Membership模型相关的模型。
到目前为止,我已经成功地以Person更改形式显示了默认的m2m小部件并正确创建了中间模型实例,但是我的问题Person是在修改a时填充小部件。
这是我正在使用的表单类PersonAdmin:
class PersonForm(forms.ModelForm):
projects = forms.ModelMultipleChoiceField(models.Project.objects.all(),
widget=widgets.FilteredSelectMultiple(
verbose_name="Projects",
is_stacked=False,
attrs={'rows':'10'}))
projects.required = False
class Meta:
model = models.Person
fields = ['name', 'last_name', 'personal_id_number',
'personal_id_type', 'administrative_viability',
'observations']
def save(self, commit=True):
ret = super(PersonForm, self).save(commit)
for p in self.cleaned_data['projects']:
models.Membership.objects.create(person=self.instance, project=p)
return ret
Run Code Online (Sandbox Code Playgroud)
和PersonAdmin本身:
class PersonAdmin(admin.ModelAdmin):
form = PersonForm
def get_changeform_initial_data(self, request):
initial = super(PersonAdmin, self).get_changeform_initial_data(request)
initial['projects'] = models.Person.get(pk=initial['person']).project_set.all()
return initial
Run Code Online (Sandbox Code Playgroud)
我试图像这样projects在方法中设置初始值get_changeform_initial_data,但它不起作用。总的来说,它似乎被忽略了,好像我没有适当地覆盖它。 …