简体   繁体   中英

django object has no attribute 'count'

I am learning django / python and I am stuck on an issue.

I have a view: create_document.py in which I want to count the number of name details from a models class: NameDetails .

I cannot get the correct syntax!

Here is my models.py code:

class NameDetails(FillableModelWithLanguageVersion):
    user = models.ForeignKey(User)
    name_details_prefix_title = models.CharField(null=True, blank=True, max_length=25)
    name_details_first_name = models.CharField(null=False, blank=False, max_length=50)
    name_details_middle_name = models.CharField(null=True, blank=True, max_length=100)
    ....

Here is my create_document.py code in which I have a django wizard. I want to make sure the user has more than 1 name before they can create a document:

from app_name.core.models import NameDetails

class CreateDocumentWizard(SessionWizardView):
    template_name = 'documents/document_create.html'

    form_list = [
        core_forms.CreateDocumentWizardForm01,
        core_forms.CreateDocumentWizardForm02,
        core_forms.CreateDocumentWizardForm03,
        core_forms.CreateDocumentWizardForm04,
    ]

    def get_form_kwargs(self, step=None):
        kwargs = super(CreateDocumentWizard, self).get_form_kwargs(step)
        kwargs.setdefault('user', self.request.user)
        return kwargs

    def get_context_data(self, form, **kwargs):

        name_details_count = NameDetails(user=self.request.user).count()
        if name_details_count < 1:
            return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)

When I use the line to determine the count of NameDetails of the user: name_details_count = NameDetails(user=self.request.user).count() , I get the following error:

NameDetails' object has no attribute 'count'

I have tried many permutations, but I am stuck.

At the moment you're creating a brand new NameDetails instance with request.user as the user. Instead, you should query the database for existing NameDetails for the current user, and count them. You can query the database through NameDetails.objects :

name_details_count = NameDetails.objects.filter(user=self.request.user).count()

在您的get_context_data函数中应该像这样:

name_details_count = NameDetails.objects.filter(user=self.request.user).count()

Each time you need to make a Django QuerySet youhave to go through the object manager objects so : NameDetails.objects. in order to make a count you need a list so you use filter :

name_details_count = NameDetails.objects.filter(user=self.request.user).count()

in case you need one element you use get :

name_details_count = NameDetails.objects.get(user=self.request.user)

for redirection use better HttpResponseRedirect and make sure the link in setting is correct:

return HttpResponseRedirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)

This is a Python or maybe even more generally, a programming question.

Your line:

name_details_count = NameDetails(user=self.request.user).count()

Is Calling the constructor of the NameDetails class and attempting to call a function count that doesn't exist on it (hence the error type).

To get a list of all NameDetails instances with that user, you use:

name_details = NameDetails.objects.filter(user=self.request.user)

And to get the number of items in this list, you can simply use the python built-in len() function like so:

name_details_count = len(NameDetails.objects.filter(user=self.request.user))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM