Я изучаю Django / Python, и я застрял в проблеме.

У меня есть представление: create_document.py, в котором я хочу подсчитать количество деталей имени из класса моделей: NameDetails.

Я не могу получить правильный синтаксис!

Вот мой models.py код:

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)
    ....

Вот мой create_document.py код, в котором у меня есть мастер django. Я хочу убедиться, что у пользователя есть более 1 имени, прежде чем он сможет создать документ:

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)

Когда я использую строку для определения количества NameDetails пользователя: name_details_count = NameDetails(user=self.request.user).count(), я получаю следующую ошибку:

Объект NameDetails не имеет атрибута 'count'

Я пробовал много перестановок, но я застрял.

0
user3354539 15 Дек 2015 в 00:38

4 ответа

Лучший ответ

Так должно быть в вашей функции get_context_data:

name_details_count = NameDetails.objects.filter(user=self.request.user).count()
4
ddalu5 24 Дек 2015 в 12:26

В данный момент вы создаете новый NameDetails экземпляр с request.user в качестве пользователя. Вместо этого вам следует запросить в базе данных наличие NameDetails для текущего пользователя и сосчитать их. Вы можете запросить базу данных через NameDetails.objects:

name_details_count = NameDetails.objects.filter(user=self.request.user).count()
4
knbk 14 Дек 2015 в 21:59

Каждый раз, когда вам нужно создать Django QuerySet, вы должны пройти через диспетчер объектов objects так: NameDetails.objects. для подсчета вам нужен список, поэтому вы используете filter :

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

Если вам нужен один элемент, который вы используете get:

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

Для перенаправления лучше использовать HttpResponseRedirect и убедитесь, что ссылка в настройке верна:

return HttpResponseRedirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)
2
DhiaTN 14 Дек 2015 в 22:16

Это Python или, может быть, даже более общий вопрос программирования.

Ваша линия:

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

Вызывает конструктор класса NameDetails и пытается вызвать функцию count, которой в нем нет (отсюда тип ошибки) ,

Чтобы получить список всех NameDetails экземпляров этого пользователя, используйте:

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

И чтобы получить количество элементов в этом списке, вы можете просто использовать встроенную функцию python len() следующим образом:

name_details_count = len(NameDetails.objects.filter(user=self.request.user))
2
rigdonmr 15 Дек 2015 в 06:18