Джанго get_FIELD_display - PullRequest
       1

Джанго get_FIELD_display

2 голосов
/ 14 сентября 2010

Я пытаюсь получить доступ к data.get_age_display в своем шаблоне электронной почты. Я не могу понять это. Я не уверен, что я делаю неправильно, я использовал get_FIELD_display много раз, но передал в качестве контекста в нормальный шаблон. Есть ли что-то другое с формами?

class RequestForm(forms.Form):

    ADULT = 1
    SENIOR = 2
    STUDENT = 3

    AGE_GROUP = (
        (ADULT, 'Adult'),
        (SENIOR, 'Senior'),
        (STUDENT, 'Student'),
    )


    name = forms.CharField(max_length=255)
    phone = forms.CharField(max_length=15)
    age = forms.ChoiceField(choices=AGE_GROUP)
    details = forms.CharField(widget=forms.Textarea())

    def save(self):
        order = Order(
            name = self.cleaned_data['name'],
            phone = self.cleaned_data['phone'],
            age = self.cleaned_data['age'],
            details = self.cleaned_data['details'],
        )
        order.save()

        template = loader.get_template('request_email.txt')

        # send over the order object in an email extracted so they can handle the ticket order
        context = Context({
            'data': order,
        })

        #import pdb; pdb.set_trace()

        email_subject = 'Request Tickets'
        mail_managers(email_subject, template.render(context))

в моем request_email.txt все, что я делаю, это {{data.get_age_display}} какие-нибудь идеи?

Джеф

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Я знаю, что это будет WAAAAAY позже, чем вопрос, который будет опубликован, но вот мой ответ для полноты и всех, кому это может пригодиться: -)

Я собираюсь предположить, что в AGE_GROUP ADULT, SENIOR и STUDENT являются целыми числами. Ваша очистка формы НЕ будет автоматически очищать строку, содержащуюся в POST, и возвращает целое число. Итак, в этом коде:

context = Context({
    'data': order,
})

вы бы подумали, что order.age ссылается на целое число, но на самом деле это неверно. Это обожгло меня несколько раз, потому что будет правильно сохранять целое число в физической таблице, но экземпляр заказа все еще имеет строковое представление поля age.

Вы можете сделать одну из двух вещей:
1. Очистите это в поле:

clean_age(self):  
    return int(self.cleaned_data['age'])

или создайте новый тип поля:

def MyChoiceField(forms.ChoiceField):  
    def clean(self, value):  
        if not value:  
            if self.required:  
                raise forms.ValidationError(self.error_messages['required'])  
                return None  
            else:  
                return None  
        return int(value)

ссылка на поле формы:

age = MyChoiceField(choices=AGE_GROUP)

и тогда вы сможете применить эту логику к любому другому подобному полю выбора в будущем. Лично я считаю, что последний подход является лучшим, и я вставляю все свои типы пользовательских полей в файл form_utils, чтобы я мог использовать их везде. Другой недостаток заключается в том, что forms.charField не удаляет автоматически введенный текст, и вы также можете использовать этот подход, чтобы исправить это.

0 голосов
/ 14 сентября 2010

Вы не показали код создаваемой модели заказа.Вы уверены, что в поле age на модели установлено значение choices?

По какой причине вы не используете ModelForm?Вы создаете объект Order в методе save() формы, но не возвращаете его.Modelform сделает это за вас, а также избавит от необходимости переопределять поля формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...