2016-02-05 1 views
1

Мне нужно передать значение (на основе category_id) для ForeignKey в ModelForm, но оно не работает. Мое поле остается «--------», и правильное значение не задано в раскрывающемся поле. Значение для категории должно быть выбрано, а другие значения должны быть скрыты от пользователя по выбору.внешний ключ как начальное значение, не переданное в ModelForm в django

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

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

Будем благодарны за любые решения!

мой models.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'), 
] 

мой views.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}) 

мой forms.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> 
+0

Но у вашей модели 'Category' какие-либо данные? –

+1

Почему вы передаете имя категории в 'form = TransactionForm (request.POST или None, initial = {'category': category.name,})'? Вы пробовали '{'category': category}'? – LostMyGlasses

+0

@ Shang Wang, Конечно, есть записи. переменная for_debug успешно прошла в шаблон –

ответ

1

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

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

с

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

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