внешний ключ как начальное значение не передается в ModelForm в django

Мне нужно передать значение (на основе category_id) для ForeignKey в ModelForm, но оно не работает. Мое поле остается «--------», и в раскрывающемся поле не задано правильное значение. Значение для категории должно БЫТЬ ВЫБРАННЫМ, а другие значения не должны быть скрыты от выбора пользователя.

Поскольку значение категории результата успешно передано в шаблон, но раскрывающееся поле Категория не установлено!

Как я вижу, другие ребята решили это с помощью конструктора для ModelForm, но я чувствую, что должно быть собственное решение django.

Буду признателен за любые решения!

мои модели.py:

class Category(models.Model):
    name = models.CharField('Name', max_length=20)
    icon = models.CharField('Icon', blank=True, max_length=20)

class Transaction(models.Model):
    type = models.CharField('Type', default='exp', max_length=20)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
    note = models.CharField('Note', blank=True, max_length=20)

мой urls.py:

urlpatterns = [
url(r'^add/(?P<category_id>[0-9]+)', "core.views.add_trans_view", name='add_trans_url'),
]

мои взгляды.py:

def add_trans_view(request, category_id):
    category = Category.objects.get(id=category_id)
    form = TransactionForm(request.POST or None, initial={'category':category.name,})
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
        return render(request,
            'core/transaction_form.html', {'form': form, 'for_debug':category})

мои формы.py:

class TransactionForm(forms.ModelForm):
class Meta:
    model = Transaction
    fields = ['type', 'category', 'note']

мой шаблон:

<p>Initial 'category' value transfered from view:</p>
<h4>{{for_debug}}</h4>
<form method='POST' action=''> {% csrf_token %}
  {{form.as_p}}
  <input type='submit' value='Done'/>    
</form>

person Karabas Barabas    schedule 05.02.2016    source источник
comment
Но есть ли в вашей модели Category какие-либо данные?   -  person Shang Wang    schedule 05.02.2016
comment
Почему вы передаете название категории в form = TransactionForm(request.POST or None, initial={'category':category.name,})? Вы пробовали {'category':category}?   -  person LostMyGlasses    schedule 05.02.2016
comment
@Shang Wang, Конечно, есть записи. переменная for_debug успешно передана в шаблон   -  person Karabas Barabas    schedule 05.02.2016
comment
Я имею в виду, когда вы инициализируете форму в initial={'category':category.name,}. Попробуйте использовать category (экземпляр) вместо category.name.   -  person LostMyGlasses    schedule 05.02.2016
comment
@LostMyGlasses, ты чертовски хорош! Спасибо за мазок пальцем! Пожалуйста, ответьте - я проголосую   -  person Karabas Barabas    schedule 05.02.2016
comment
Большой! выложу как ответ   -  person LostMyGlasses    schedule 05.02.2016


Ответы (1)


Попробуйте заменить

form = TransactionForm(request.POST or None, initial={'category':category.name,})

с

form = TransactionForm(request.POST or None, initial={'category':category,})

initial нужен экземпляр (category), а не только строка, содержащая его имя (category.name).

person LostMyGlasses    schedule 05.02.2016