Заполните форму Django данными, полученными из URL-адреса
Я хочу создать новый Fallacy (см. models.py) через форму, на которую я попадаю по url path('<slug:slug_tree>/new/', views.CreateFallacyView.as_view(), name='create_fallacy'),
.
То есть пользователь находится на странице TreeDetailView
(которая соответствует определенному Дереву), и он может добавить новую Фаллацию к этому дереву. Пользователь должен ввести название и деталь, но Дерево (ForeignKey) должно быть назначено в коде. Он должен быть присвоен соответствующему Дереву, из которого он был направлен в CreateFallacyView.
Slug дерева находится внутри URL, поэтому я подумал, что могу как-то использовать эту информацию, но я понятия не имею, как я могу действовать с этой информацией.
Любая помощь будет принята с благодарностью! Или, возможно, есть другие более элегантные решения?
Большое спасибо!
models.py
class Tree(models.Model):
title = models.CharField(max_length=50)
detail = models.TextField()
slug = models.SlugField(allow_unicode=True, unique=True, null=True, blank=True)
class Fallacy(models.Model):
title = models.CharField(max_length=50)
detail = models.TextField()
tree = models.ForeignKey(Tree, related_name='fallacy', on_delete=models.CASCADE)
views.py
class CreateFallacyView(generic.CreateView):
form_class = forms.FallacyForm
forms.py
class FallacyForm(forms.ModelForm):
class Meta:
model = models.Fallacy
fields = ('title', 'detail')
urls.py
app_name = 'argtree'
urlpatterns = [
path('', views.TreeListView.as_view(), name='all'),
path('<slug:slug_tree>/', views.TreeDetailView.as_view(), name='tree_detail'),
path('<slug:slug_tree>/new/', views.CreateFallacyView.as_view(), name='create_fallacy'),
В CreateFallacyView
вы можете связать его с данным Tree
в .form_valid(…)
методом [Django-doc] с:
from django.shortcuts import get_object_or_404
class CreateFallacyView(generic.CreateView):
form_class = forms.FallacyForm
def form_valid(self, form):
tree = get_object_or_404(Tree, slug=self.kwargs['slug_tree'])
form.instance.tree = tree
return super().form_valid(form)