Django: как получить доступ к данным поля модели в шаблонах - PullRequest
0 голосов
/ 08 июля 2010

У меня есть страница, на которой отображается форма, которую зарегистрированный пользователь может использовать для редактирования своего профиля.

При первой загрузке пользователем соответствующего представления с помощью запроса GET в форме должны отображаться значения существующей записи профиля пользователя.

Поскольку я хотел бы иметь детальный контроль над разметкой, используемой для полей формы, я хотел бы получить только значения полей и вручную написать необходимую разметку входного элемента, вставляя полученные значения полей в качестве входных элементов ' Атрибут 'value' (вместо того, чтобы django отображал все входные элементы).

До сих пор я пытался использовать директивы типа {{form.myfield.data}} в моем шаблоне для доступа к данным поля, но это возвращает «Нет», а не данные профиля, как я ожидал.

Если пользователь только что опубликовал действительную форму, поля формы содержат ожидаемые данные профиля.

Я надеюсь, что кто-то может помочь мне понять, что я делаю здесь неправильно:

Вот мой взгляд:

@login_required
def edit(request):
    # get logged-in user's profile
    obj=Profile.objects.get(user=request.user)
    if request.method == 'POST': # If the form has been submitted...
        form = ProfileForm(request.POST, request.FILES, instance=obj)   
        if form.is_valid(): # All validation rules pass
            form.save()
            request.flash['success'] = "Your profile has been updated." # Puts a string to the flash scope
        else:
            request.flash['error'] = 'Please correct the problems below and try again' # Puts a string to the flash scope
    else:
        # if no form was submitted
        # derive the form data from the logged-in users existing profile
        form = ProfileForm(instance=obj)    
    return render_to_response('app_profile/edit.html',
    {
    'form': form,
    'user': request.user,
    'ancestor_urls': ['app_profile.views.edit',],
    },context_instance=RequestContext(request)
)

А вот выдержка из соответствующего шаблона. Этот элемент ввода имеет дело с полем с именем 'display_name'.

<input type="text"
class="textInput large {% if form.display_name.errors %}error{% endif %}"
maxlength="50"
size="35"
value="{{ form.display_name.data }}"
id="id_display_name"
name="display_name">

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Способ сделать то, что вы хотите сделать, это написать пользовательские виджеты форм, вместо того, чтобы делать это в шаблоне.

Вы можете создать полностью собственный виджет или просто добавить / изменить атрибуты на уровне формы при init ModelForm

0 голосов
/ 09 июля 2010

Я полагаю, что вы можете решить некоторые из ваших проблем, не создавая пользовательский виджет с помощью виджетов attrs аргумент: http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs, также у вас есть несколько вариантов стилевого оформления с использованием идентификатора ввода!

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