Django 根据模型动态更改表单



我是Python编程和Django框架的新手。

我有一个名为"设备"的应用程序,其中包含多个相互关联的表(品牌,版本,位置等(,并且具有crud。我想做的是重用我的函数(列表,创建,详细信息等(,而不是为每个表创建单独的函数。

现在我无法动态地将BrandForm更改为示例VersionForm。这可能吗?我做的对吗?

urls.py

from django.urls import path
from .views import *
app_name = 'devices'
urlpatterns = [
# BRAND
path('brand/create', create_view, name='brand-create'),
# VERSION
path('version/create', create_view, name='version-create'),
]   

views.py

from .models import *
from .forms import BrandForm, VersionForm   
# GET PAGE NAME TO GET MODEL NAME
def get_page_name(request):
currentUrl = request.get_full_path()
page = currentUrl.split('/')[-2].split('.')[0] # Example /devices/brand/list; Get 2nd URL
return page
def create_view(request):
page = get_page_name(request) # GET PAGE MODEL NAME
page_title = 'Create ' + page.capitalize()
model = apps.get_model('devices', page.capitalize())
status = "created"
if request.method == 'POST':
form = BrandForm(request.POST)
else:
form = BrandForm()
return save_brand_form(request, form, 'devices/brand/create.html', page_title, status)

虽然可以修复您的解决方案,但它将是非标准的,很难阅读,并且可能充满了错误。幸运的是,django 提供了非常好的解决方案来实现 CRUD - 基于类的视图。

所以,在你的情况下:
urls.py

from .views import BrandCreateView, VersionCreateView

urlpatterns = [
path('brand/create', BrandCreateView.as_view()),
path('version/create', VersionCreateView.as_view()),
]

views.py

from django.views.generic.edit import CreateView
from .models import Brand, Version
from .forms import BrandForm, VersionForm  

class BrandCreateView(CreateView):
model = Brand
form_class = BrandForm
template_name = 'devices/brand/create.html'

class VersionCreateView(CreateView):
model = Version
form_class = VersionForm
template_name = 'devices/version/create.html'

最新更新