Как настроить вид формы, используя общий вид CreateView в Django - PullRequest
2 голосов
/ 29 марта 2012

Я не очень хорош с form.

Джанго. Вот Order из models.py

class Order( models.Model ) :
    def __unicode__( self ) :
        return unicode( self.pk )

    def get_absolute_url( self ) :
        return reverse( 'orders_detail', args = [ self.pk ] )

    STATUS_CHOICES = (
        ( 'p', 'pending'  ),
        ( 'a', 'approved' ),
        ( 'r', 'rejected' ),
        ( 'c', 'closed'   ),
        ( 'l', 'locked'   ),
    )

    WORK_TYPE_CHOICES = (
        ( 'hc', 'Heating and cooling' ),
        ( 'el', 'Electrical'          ),
        ( 'pl', 'Plumbing'            ),
        ( 'ap', 'Appliances'          ),
        ( 'pe', 'Pests'               ),
        ( 'ex', 'Exterior'            ),
        ( 'in', 'Interior'            ),
        ( 'sa', 'Safety'              ),
        ( 'ot', 'Others'              ),
    )

    creator   = models.ForeignKey( User, related_name = 'creator' )
    approver  = models.ForeignKey( User, related_name = 'approver' )
    comments  = models.TextField( blank = True )
    status    = models.CharField( max_length = 1, choices = STATUS_CHOICES, default = 'p' )
    quote     = models.DecimalField( max_digits = 8, decimal_places = 2, null = True, blank = True )
    payment   = models.DecimalField( max_digits = 8, decimal_places = 2, null = True, blank = True )
    work_type = models.CharField( max_length = 2, choices = WORK_TYPE_CHOICES )
    vendor    = models.ForeignKey( Vendor, null = True, blank = True )
    created   = models.DateTimeField( auto_now_add = True )
    modified  = models.DateTimeField( auto_now = True )

class OrderCreateForm( ModelForm ) :
    class Meta :
        model = Order
        fields = (
            'creator',
            'approver',
            'comments',
            'work_type',
        )

Пока я использую общий вид CreateViewдля Order модели в urls.py

url(
    r'^orders/create/$',
    CreateView.as_view(
        model = Order,
        template_name = 'doors/orders/create.html',
        form_class = OrderCreateForm
    ),
    name = 'orders_create'
),

В моем шаблоне у меня просто есть

{% extends "base.html" %}

{% block title %}Create order{% endblock %}

{% block content %}
    {{ form }}
{% endblock %}

, и он создает частичную форму (без кнопки отправки), как это

image

Однако я хочу контролировать видимость полей creator и approver в зависимости от user.get_profile().user_type.Если зарегистрированный пользователь user_type не является менеджером, то creator автоматически устанавливается как пользователь, а approver также устанавливается автоматически.Если user_type является менеджером, то этот пользователь может указать оба поля для разных пользователей.

Я также хочу иметь возможность называть фактические метки каждого поля.Например, измените Work type на Category.

В настоящее время я думаю, что единственный способ сделать это - сделать {% for field in form %} внутри шаблона и запустить несколько строк, таких как {% if field.name == "creator" %}.Есть ли более простой способ, чем набор контролируемых циклов и операторов if-then?

1 Ответ

2 голосов
/ 29 марта 2012

Я хочу управлять видимостью полей создателя и утверждающего в зависимости от user.get_profile (). User_type. Если вошедший в систему пользовательский user_type не является менеджером, то создатель автоматически устанавливается как пользователь, а утверждающий также устанавливается автоматически. Если user_type является менеджером, этот пользователь может указать оба поля для разных пользователей.

Я бы сделал еще одну форму для простого пользователя:

class UserOrderCreateForm( ModelForm ) :
    class Meta :
        model = Order
        fields = (
            'comments',
            'work_type',
        )

    def __init__(self, *args, **kwargs):
         self.user = kwargs.pop('user')
        super(UserOrderCreateForm, self).__init__(*args, **kwargs)

    def save(self):
        result = super(UserOrderCreateForm, self).save(commit=False)
        result.creator = self.user
        result.approver = self.user.some_other_field # "will be set also set automatically"
        result.save()
        return result

Тогда вы можете решить, какую форму использовать в поле зрения. Используйте это как

form = UserOrderCreateForm(user=request.user)

Я думаю, вам придется потратить некоторое время, чтобы заставить его работать с CreateView. Вот почему я не люблю CBV. : -)

Я также хочу иметь возможность называть фактические метки каждого поля. Например, измените Work type на Category.

work_type = models.CharField( max_length = 2, choices = WORK_TYPE_CHOICES, verbose_name=u'Category')
...