Как инициализировать значение в выпадающем меню ForeignKey из представления в Django - PullRequest
0 голосов
/ 02 июля 2019

Мне нужно установить значение моего раскрывающегося списка ForeignKey = в качестве параметра URL при отображении формы.Я могу успешно установить другие поля формы для этого значения, но не для ForeignKey.

Я пытаюсь инициализировать поле формы 'reference', которое является внешним ключом, используя значение reference_id, которое передается через URL,Я могу успешно присвоить это значение трем другим полям формы, но не 'reference'.

Models.py

class Manifests(models.Model):

    reference = models.ForeignKey(Orders)
    cases = models.IntegerField()
    description = models.CharField(max_length=1000)
    count = models.IntegerField()

    def __str__(self):
        return self.description

Forms.py

class CreateManifestForm(forms.ModelForm):

    class Meta:
        model = Manifests
        fields = ('reference', 'cases', 'description', 'count')

Views.py

def add_manifest(request, reference_id):

    if request.method == "POST":
        form = CreateManifestForm(request.POST)

        if form.is_valid():
            instance = form.save(commit=False)
            try:
                order = Orders.objects.get(id=reference_id)
            except Orders.DoesNotExist:
                pass
            instance.reference = order
            instance.save()
            return redirect('add_manifest', reference_id=reference_id)

    #this is where my problem is
    form = CreateManifestForm(initial={'reference': reference_id}) 
    reference = request.POST.get('reference')
    manifests = Manifests.objects.all().filter(reference=reference)

    context = {
        'form': form,
        'reference_id': reference_id,
        'manifests' : manifests,
    }

    return render(request, 'add_manifest.html', context)

И на всякий случай, если это необходимо:

urls.py

url(r'^add_manifest/(?P<reference_id>\d+)/$', add_manifest, name='add_manifest'),

Нет ошибок, но поле не устанавливаетсяк значению, переданному через URL.Как я уже сказал, если я попробую

 form = CreateManifestForm(initial={'cases': reference_id})

, тогда поле падежей принимает это значение, так что я просто не уверен, как перемещаться в случае внешнего ключа

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Сначала поймите понятие здесь:

class Manifests(models.Model):
    # Though this reference store id from Orders
    # Its actually a Orders object
    reference = models.ForeignKey(Orders)

В Django, когда бы мы ни выполняли присваивание внешнего ключа, первичный ключ внешнего объекта сохраняется в столбце текущих объектов только в базе данных , но когда мы обращаемся к нему в код питона , он возвращает весь посторонний объект .

Теперь давайте посмотрим на вашу проблему здесь:

form = CreateManifestForm(initial={'reference': reference_id})

В приведенном выше коде вы инициализируете CreateManifestFormCreate атрибут 'reference' с Integer объектом, который является неправильным , поскольку для него требуется Orders объект, который будет назначен.

form = CreateManifestForm(initial={'cases': reference_id})

И выше код работает правильно, потому что 'cases' принимает объект Integer.

Итак, решение вашей проблемы:

Запрашивая объект Orders, передавая reference_id

form = CreateManifestForm(initial={'reference': Orders.objects.get(id=reference_id)})

Надеюсь, это поможет !!!

0 голосов
/ 02 июля 2019

Глядя на аналогичный вопрос / ответ , вам нужно будет установить Orders экземпляр в initial для поля reference, а не только id связанного объекта.

Может быть, вы могли бы попробовать что-то вроде этого и посмотреть, работает ли это:

reference_pk = request.POST.get('reference', '')
reference = Orders.objects.get(pk=reference_pk)
form = CreateManifestForm(initial={'reference': reference})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...