Создание представления с отношением OneToOneField в одном представлении

#django #django-models #django-forms

#django #django-модели #django-формы

Вопрос:

Я новичок в Django и пытаюсь реализовать CreateView на основе классов с двумя формами и отношением OneToOne, но не знаю, как это сделать в одном представлении.

Например: приведено следующее:

 #models.py
# some imports..

class RedItem(models.Model):
   name = models.Charfield(max_length=255)
   storage = models.OneToOneField("Storage", on_delete=models.CASCADE)

class BlueItem(models.Model):
   name = models.Charfield(max_length=255)
   storage = models.OneToOneField("Storage", on_delete=models.CASCADE)

class Storage(models.Model):
   shelf = models.Charfield(max_length=255)
   room = models.Charfield(max_length=255)
  

…представление:

 #views.py
from django.views.generic.edit import CreateView
from .models import RedItem, BlueItem, Storage
# some other imports..

class RedItemCreate(CreateView):
   model = RedItem
   fields = ['name']
   template_name_suffix = "_form"

```html
and a Form:
```html
<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>
  

Теперь вопрос в том, как пользователь может заполнить оба (например, RedItem Storage) в одном пакете?
Заранее спасибо за любое направление.

Обновление и рабочий подход: я должен создавать формы в forms.py и добавьте его в CreateView.

 #urls.py
from django.urls import path
from .views import *

urlpatterns = [
    path('reditemlist/', ExampleList.as_view(), name='example_list'),
    path('reditemcreate/', ExampleCreate.as_view(),  name='example_create')
]
  
 #forms.py
from django.forms import ModelForm
from .models import RedItem, Storage

class RedItemForm(ModelForm):
    class Meta:
        model = RedItem
        fields = ['name']

class StorageForm(ModelForm):
    class Meta:
        model = Storage
        fields = ['shelf']
  

И CreateView:

 #views.py
from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView
from .models import *
from .forms import *
from django.urls import reverse_lazy

class ExampleList(ListView):
    model = RedItem

class ExampleCreate(CreateView):
    model = RedItem
    form_class = RedItemForm
    success_url = reverse_lazy('example_list')
    
    def get_context_data(self, **kwargs):
        context = super(ExampleCreate, self).get_context_data(**kwargs)
        if self.request.POST:
            context['reditem'] = RedItemForm(self.request.POST)
            context['storage'] = StorageForm(self.request.POST)
        else:
            context['reditem'] = RedItemForm()
            context['storage'] = StorageForm()
        return context 

    def form_valid(self, form):
        context = self.get_context_data()
        storage = context['storage']
        if storage.is_valid() and form.is_valid():
            f = form.save()
            shelf = storage.save(commit = False)
            shelf.reditem = f
            shelf.save()
        return super().form_valid(form)
  
 <form method="post">{% csrf_token %}
    {{ form.as_p }}
    {{ storage.as_p }}
    <input type="submit" value="Save">
</form>
  

Следующая остановка: UpdateView