Как я могу удалить ключ из этой ModelForm - PullRequest
1 голос
/ 18 июля 2011

У меня есть следующая ModelForm, и я получаю нужные результаты, но не могу понять, как удалить ключ из результатов.

Форма:

class TicketActionsForm(ModelForm):
assign = forms.ModelChoiceField(queryset=Users.objects.values('user').filter(account=3), empty_label="  Select Admin  ")

Просмотреть инструкцию возврата:

return render_to_response('tickets/view.html',
    {'ticket':ticket,'ticketactions':TicketActionsForm()},
    context_instance=RequestContext(request)
)

Шаблон:

{{ ticketactions.assign }}

Результаты: (скриншот: http://snapplr.com/z7t7)

<option value="" selected="selected">  Select Admin  </option> 
<option value="{&#39;user&#39;: u&#39;Chris&#39;}">{&#39;user&#39;: u&#39;Chris&#39;}    </option> 
<option value="{&#39;user&#39;: u&#39;mmiller&#39;}">{&#39;user&#39;: u&#39;mmiller&#39;}</option> 
<option value="{&#39;user&#39;: u&#39;millerm&#39;}">{&#39;user&#39;: u&#39;millerm&#39;}</option> 
<option value="{&#39;user&#39;: u&#39;Cindy222&#39;}">{&#39;user&#39;: u&#39;Cindy222&#39;}</option> 

Редактировать:

Я могу легко обновить метку с помощью следующего переопределения, но я все еще сталкиваюсь с тем, как изменить значения параметров.Я, вероятно, могу отредактировать данные после того, как они будут POST'ами, но я бы предпочел очистить их до этого.

class UserModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
    return obj['user']

Разрешение:

В итоге я немного взломал init для получения желаемых результатов.

def __init__(self, *args, **kwargs):
    super(TicketActionsForm, self).__init__(*args, **kwargs)
    newChoices = []
    for item in self.fields['assign'].queryset:
        choice=(item['user'],item['user'])
        newChoices.append(choice)
    self.fields['assign'].choices = newChoices

1 Ответ

1 голос
/ 18 июля 2011

Этот ответ имеет простой способ изменить метки, используемые в ModelChoiceField.

Когда вы используете ModelChoiceField, вы, вероятно, захотите вызвать Users.objects.all() вместо Users.objects.values('user').

То, что вы хотите сделать тогда, будет иметь следующий код:

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.get_full_name()

, а когда вы создаете форму, вы должны иметь следующий код:

class TicketActionsForm(ModelForm):
    assign = forms.ModelChoiceField(queryset=Users.objects.all().filter(account=3), empty_label="  Select Admin  ")

Таким образом, набор (точнее, QuerySet) строк передается объекту ModelChoiceField, и он будет иметь доступ ко всем полям.Используя приведенный выше код, вы можете управлять меткой, а при изменении objects.values('user').filter на objects.all().filter свойство value тега <option> станет id строки.Затем вы можете использовать входящие id из request.POST или request.GET, чтобы сохранить их в своей базе данных, как любое другое поле, которое вам нравится, запустив запрос.Однако в большинстве случаев вы, вероятно, захотите сохранить его как id в базе данных.

...