【问题标题】:modelform "object not callable" errormodelform“对象不可调用”错误
【发布时间】:2011-01-27 00:05:12
【问题描述】:

好的,所以我对 Django 还很陌生,但一直在阅读在线 django 书籍和 djangoproject 文档,但我似乎无法弄清楚这个错误:

我有一个“订单”模型:

class Orders(models.Model):
    client_id = models.ForeignKey(Client)
    order_date = models.DateField(auto_now_add = True)
    due_date = models.DateField()
    completion_date = models.DateField(blank=True, null=True)
    rush_order = models.BooleanField(default=False)
    billing_option = models.ForeignKey(Billing)
    patient_first_name = models.CharField(max_length=30)
    patient_middle_name = models.CharField(max_length=30, blank=True)
    patient_last_name = models.CharField(max_length=30)
    client_patient_id = models.CharField(max_length=30, blank=True)
    emodel_patient_id = models.CharField(max_length=30)
    special_instructions = models.TextField(blank=True)
    order_items = models.ManyToManyField(Order_Items)

    def __unicode__(self):
        return '%s : %s %s O: %s F: %s' % (self.client_id, self.patient_first_name, self.patient_last_name, self.order_date, self.completion_date)

    class Meta:
        ordering = ['client_id']

我有一个“SearchOrderForm”模型:


class SearchOrderForm(ModelForm):
    class Meta:
        model = Orders
        exclude = ('rush_order', 'billing_option', 'client_patient_id', 'special_instructions', 'order_items',)

我有一个“order_status”函数:

def order_status(request):
    error = False
    error_searching = False
    if request.method == 'POST':
            OrderFormSet = SearchOrderForm()
            formset = OrderFormSet()
            if formset.is_valid():
                cd = formset.cleaned_data()
                emodels_results = cd()
                emodels_results = cd(queryset = Order.objects.filter(Q(patient_first_name=search)|Q(patient_last_name=search)|Q(client_id=search)))
                patient_first_name = request.POST('patient_first_name', None)
                if patient_first_name:
                    emodels_results = emodels_results(queryset = Order.objects.filter(patient_first_name=patient_first_name))

                patient_last_name = request.POST('patient_last_name', None)
                if patient_last_name:
                    emodels_results = emodels_results(queryset = Order.objects.filter(patient_last_name=patient_last_name))

                client_id = request.POST('client_id', None)
                if client_id:
                    emodels_results = emodels_results(queryset = Order.objects.filter(client_id=client_id))

                return render_to_response('search_results.html', {'models': emodels_results})
            else:
                emodels_results = "Still messed up!"
                return render_to_response('search_results.html', {'models': emodels_results})
        else:
            error_searching = True
            form = SearchOrderForm()
            return render_to_response('order_status.html', {'form': form, 'error': error, 'error_searching': error_searching})

我可以毫无问题地填写我的表单,但是当我提交表单时,我收到以下错误消息: 追溯: get_response 中的文件“C:\Python26\lib\site-packages\django\core\handlers\base.py” 92. 响应 = 回调(请求,*callback_args,**callback_kwargs) order_status 中的文件“C:\emodel_tracking..\emodel_tracking\tracker\views.py” 105. formset = OrderFormSet()

异常类型:/accounts/profile/orderstatus/ 处的 TypeError 异常值:“SearchOrderForm”对象不可调用

有谁知道我的 SearchOrderForm 做错了什么导致 Django 说它不可调用?

【问题讨论】:

    标签: django django-forms modelform


    【解决方案1】:

    我想你想要以下任何一个:

    OrderFormSet = SearchOrderForm()
    if OrderFormSet.is_valid():
    
    formset = SearchOrderForm()
    if formset.is_valid()
    

    第二种方式是首选的语法风格。作为吹毛求疵的问题,Django 提供了一个不同于 Form 类型的 FormSet 类型,因此习惯上将 Forms 的实例称为“form”:

    form = SearchOrderForm()
    if form.is_valid():
    

    您的代码还会遇到一些其他问题:

    def order_status(request):
        error = False
        error_searching = False
        if request.method == 'POST':
                #instead of:
                #OrderFormSet = SearchOrderForm()
                #formset = OrderFormSet()
    
                #instantiate an instance of your ModelForm
                #(I'd normally name it "form")
                formset = SearchOrderForm()
    
    
                if formset.is_valid():
                    cd = formset.cleaned_data()
                    #cd is now a Python dictionary
                    #these next 2 lines don't make sense, what is your intention?
                    emodels_results = cd()
                    emodels_results = cd(queryset = Order.objects.filter(Q(patient_first_name=search)|Q(patient_last_name=search)|Q(client_id=search)))
                    #you've already used your form to process and clean 
                    #the incoming POST data. use the cleaned data instead
                    #patient_first_name = request.POST('patient_first_name', None)
                    patient_first_name = cd.get('patient_first_name','')
    
                    #use data from the form's cleaned_data as in the line above
                    #I'm not sure what your intention is with how the emodels_results
                    #is but you'll need to rework that for it all to work 
    
                    if patient_first_name:
                        emodels_results = emodels_results(queryset = Order.objects.filter(patient_first_name=patient_first_name))
    
                    patient_last_name = request.POST('patient_last_name', None)
                    if patient_last_name:
                        emodels_results = emodels_results(queryset = Order.objects.filter(patient_last_name=patient_last_name))
    
                    client_id = request.POST('client_id', None)
                    if client_id:
                        emodels_results = emodels_results(queryset = Order.objects.filter(client_id=client_id))
    
                    return render_to_response('search_results.html', {'models': emodels_results})
                else:
                    emodels_results = "Still messed up!"
                    return render_to_response('search_results.html', {'models': emodels_results})
            else:
                error_searching = True
                form = SearchOrderForm()
                return render_to_response('order_status.html', {'form': form, 'error': error, 'error_searching': error_searching})
    

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 2019-09-04
      • 2021-06-11
      • 2016-10-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      相关资源
      最近更新 更多