Инициализируйте django.forms.ModelChoiceField, связанный с внешним ключом и значением по умолчанию - PullRequest
0 голосов
/ 11 июля 2010

У меня есть модель, которая содержит значение внешнего ключа, затем в форме, сгенерированной из этой модели как ModelChoiceField . Я хочу автоматически выбрать пользователя ( update_author ). Я пробовал приведенный ниже код, используя начальное свойство.

Представление создает набор форм с датами, инициализированными для now () для пустой формы. Но я хочу, чтобы поле update_author было инициализировано некоторым значением, и оно не работает. Даже если оболочка dev возвращает правильного пользователя (print), он все еще не выбран в списке.

Как инициализировать django.forms.ModelChoiceField, связанный с внешним ключом, значением?


models.py

from django.db import models
import datetime

class Author(models.Model):
    name = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    def __unicode__(self):
        return self.name


class DataReview(models.Model):
    comments = models.CharField(max_length=255)
    update_author = models.ForeignKey('Author')
    creation_date = models.DateTimeField('date data review created')
    update_date = models.DateTimeField('date review modified')

    def __unicode__(self):
        return "%s" % (self.comments)

forms.py исправлено

from bamboo.followup.models import *
from django import forms
from django.forms import ModelForm,Form
from django.forms.extras.widgets import SelectDateWidget
import datetime


class DataReviewForm(ModelForm):


    def __init__(self, *args, **kwargs):
         initial = {
               'update_date': datetime.datetime.now(),
               'creation_date': datetime.datetime.now(),
               'update_author': 1 # not Author.objects.get(id=1)
              }
        if kwargs.has_key('initial'):
            kwargs['initial'].update(initial)
        else:
            kwargs['initial'] = initial
        # Initializing form only after you have set initial dict
        super(DataReviewsForm,self).__init__(*args, **kwargs)
        self.fields['update_date'].widget.attrs['disabled']=''
        self.fields['creation_date'].widget.attrs['disabled']=''
    self.fields['update_author'].widget.attrs['disabled'] = ''

    class Meta:
        model = DataReview

views.py обновлено

def review(request):
    DataReviewsFormSet = modelformset_factory(DataReview, form=DataReviewsForm)
    if request.method == 'POST':
        formset = DataReviewSet(request.POST)
        if formset.is_valid():
            # do something with the formset.cleaned_dat
            print 'YOUHOU!'
    else:
        formset = DataReviewSet()
    return render_to_response('followup/runs.html', {
        "formset": formset,
        })

1 Ответ

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

Поскольку суть вашего вопроса состоит в том, как установить начальное значение для поля ForeignKey, проверьте фрагмент кода ниже.

Обратите внимание, что когда вы вводите начальное значение в поле ForeignKey, вам не нужно передавать объект. Передайте ему id / pk этого объекта, и ваша проблема будет решена.

initial = {
           'update_date': datetime.datetime.now(),
           'creation_date': datetime.datetime.now(),
           'update_author': 1 # not Author.objects.get(id=1)
          }
if kwargs.has_key('initial'):
    kwargs['initial'].update(initial)
else:
    kwargs['initial'] = initial
# Initializing form only after you have set initial dict
super(DataReviewsForm,self).__init__(*args, **kwargs)

self.fields['update_date'].widget = forms.HiddenInput()
self.fields['creation_date'].widget = forms.HiddenInput()
self.fields['update_author'].widget = forms.HiddenInput()

Намного более чистый способ сделать это.

Отключение полей Поскольку Form предоставляет «виджеты полей» только после вызова конструктора, любое обновление [будь то переопределение виджета или изменение атрибутов виджета] , может быть сделано только после этого. Или вы можете сделать это в определении поля формы, которое не применимо к вашему случаю. Короче говоря, лучше отключить поле после вызова супер-конструктора.

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