Как я могу объединить две ModelForms в одном представлении Django - PullRequest
1 голос
/ 03 июля 2019

Всем доброго времени суток, поэтому у меня есть две модели, одна из которых имеет поле внешнего ключа, указывающее на другой, и у меня есть формы моделей для каждого класса модели, и в моем views.py я хотел бы сделать модель с точкой внешнего ключав другой модели

я создал модель формы (CharacterForm и RoleForm) в моем forms.py, который бы отображал все поля, но в моем html я бы скрыл поле игрока (внешний ключ, который указывает на другую модель)так что в моем views.py я бы автоматически сделал вновь созданного персонажа игроком.

models.py

class Character(models.Model):
    #some fields

class Role(models.Model):
    player = models.ForeignKey(Character, on_delete=models.PROTECT, 
        related_name='the_player')

views.py

    def NewRole(request):
        if request.method == 'POST'
            form = CharacterForm()
            formset = RoleForm()
            if all([form.is_valid, formset.is_valid]):
                role_player = form.save()
                formset.player = role_player
                formset.save()
                return redirect('index')
        else:
            form = CharacterForm()
            formset = RoleForm()
            return render(request, 'new_role.html', {'form':form, 
                'formset':formset})

я просто хотелполе игрока под образцом для подражания, указывающее на модель персонажа, которую только что создал пользователь, и я не знаю, как лучше всего это сделать.я думал, что это сработает, но я продолжаю получать сообщение об ошибке ForeignKey Constraint.

1 Ответ

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

Вы получаете эту ошибку, потому что вы не установили значение player для экземпляра этого объекта, и, следовательно, поле player по-прежнему None при создании объекта.

Вы можете исключить это из вашего RoleForm, например:

# app/forms.py

from django import forms
from app.models import Character, Role

class CharacterForm(forms.ModelForm):

    class Meta:
        model = Character

class RoleForm(forms.ModelForm):

    class Meta:
        model = Role
        <b>exclude = ('player', )</b>

Далее, по вашему мнению, вы создаете две формы и можете связать Character после его сохранения с экземпляром Role объекта, который вы создаете, например:

from app.forms import CharacterForm, RoleForm

def new_role(request):
    if request.method == 'POST'
        cform = CharacterForm(<b>request.POST</b>)
        rform = RoleForm(<b>request.POST</b>)
        if cform.is_valid() and rform.is_valid():
            character = cform.save()
            <b>rform.instance.player = character</b>
            rform.save()
            return redirect('index')
    else:
        rform = CharacterForm()
        cform = RoleForm()
    return render(request, 'new_role.html', {'rform': form, 'cform': cform})

в вашем шаблоне, вы можете просто отобразить это как:

<form method="post" action="{% url 'name-of-new-role-view' %}">
    {% csrf_token %}
    {{ rform }}
    {{ cform }}
    <input type="submit">
</form>
...