Django Формы, поля и модели

У меня есть проблема, и я не смог найти решение. у меня следующий класс

#models.py
from django import models

class Suggest(models.Model):
    user    = models.ForeignKey(User, null= True, blank=True)
    article = models.ForeignKey(Article)
    name    = models.ChardField(max_length=100)
    types   = ( ('suggest','Sugest'),('note','Note'),('complain','Complain'))
    type    = models.CharField(max_length=80, choices = types, default='suggest')
    content = models.TextField()
    dataX   = models.CharField(max_length=200) #example

#forms.py
from django import form
from .models import Suggest

class SuggestForm(form.ModelForm): #File forms.py,
    class Meta:
       fields = ('name','type','content')

У меня есть еще несколько полных, но этого кода достаточно, чтобы объяснить мои сомнения. Мне нужно создать эту форму с двумя параметрами (статья, request.user), статья должна быть связана через скрытое поле. Когда пользователь запроса вошел в систему, его имя должно быть равно (request.user.first_name+" "+request.user.last_name) и сохранить в user идентификатор вошедшего в систему пользователя. Когда пользователь вошел в систему, должен показывать только контент.

Мое второе сомнение заключается в том, как я заполняю, например, dataX, если это поле не находится в форме


person Jorge    schedule 25.08.2013    source источник


Ответы (1)


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

def some_view(request, ...):
    suggest = Suggest()
    initial = {}
    if request.user.is_authenticated():
        suggest.user = request.user
        initial['name'] = request.user.get_full_name()

    form = SuggestForm(..., instance=suggest, initial=initial)

    if request.method == 'POST' and form.is_valid():
        form.save()
    ...

Для отображения только части полей Вы можете использовать две отдельные формы (с name и без) или добавить в шаблон оператор {% if user.is_authenticated %}, чтобы пропустить поле name при отображении HTML формы.

person HankMoody    schedule 26.08.2013