python dictionary作为字典中具有多个值的参数

2024-04-25 23:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python的新手,从python3和django1.8开始。我们可以将dictionary作为一个参数传递给它,其中包含多个值,但函数定义中的参数要小一些。在

def save_myobj(request):
    '''
    '''
    reqobj = dict(zip(request.POST.keys(), request.POST.values()))
    my_dict = prepare_profile_dict(**reqobj)
    obj =  Model.objects.get(pk=1)
    obj.__dict__.update(my_dict)
    obj.save()
    return HttpResponse("true")

以下是我的请求对象:

^{pr2}$

这是prepare_profile_dict

def prepare_profile_dict(first_name, last_name, email):
    ''' '''
    return { 
            "revenue" : get_revenue(),
            "first_name":first_name, 
            "last_name":last_name, 
            "email":email
           };

但如果出错

TypeError at /profile/save/
prepare_profile_dict() got an unexpected keyword argument 'revenue'

我不认为这和模特有什么关系。在

class Model(models.Model):
    '''
    '''
    first_name = models.TextField("first_name", blank=True, null=True, db_index=True)
    last_name  = models.TextField("last_name", blank=True, null=True, db_index=True)
    email  =  models.TextField("email", blank=True, null=True, db_index=True)
    revenue  = models.IntegerField()

Tags: nametrueobjmodelmodelsemailrequestsave
2条回答

您的prepare_profile_dict不接受revenue参数(如错误消息中所述);只接受first_namelast_name和{}。但是,调用函数时的dict扩展确实包含revenue关键字。将其从reqobj中删除:

del reqobj['revenue']

或者在prepare_profile_dict结尾添加一个**kwargs参数,以捕捉任何额外的关键字参数(在函数内部将被忽略)。在

^{pr2}$

(显然,csrfmiddlewaretoken也是如此。)


此外,还可以使用querysets^{}方法: ^{3}$

使用ModelForm的正常解决方案:

# forms.py
from django import forms
from .models import Profile
from .somewhere import get_revenue

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = "__all__"

   def clean_revenue(self):
       return get_revenue()

# views.py
from .forms import ProfileForm
from .models import Profile

def save_myobj(request):
    if request.method !== "POST":
        return HttpResponseNotAllowed(["POST"])

    profile = Profile.objects.get(pk=1)
    form = ProfileForm(request.POST, instance=profile)
    if form.is_valid():
        form.save()         
        return HttpResponse("true")
    # returning form.errors might be better
    # but anyway:
    return HttpResponse("false") 

相关问题 更多 >