我认为一个例子可以更好地解释它。
让我们说我正在为各种图书馆申请展示他们有哪些书籍。
该网站将拥有通过内置用户注册系统和用户模型注册的用户。这些用户(想象它像图书馆成员一样)可以访问图书馆并浏览和查看可用的图书。
该网站还允许图书馆自行注册,部分注册正在宣布“图书管理员”,#34;控制其特定图书馆中可用图书的人。
我想创建一个图书馆注册表格,它可以获取该图书馆及其图书馆员的信息,不仅可以创建图书馆模型的实例,还可以创建用户模型的实例。图书馆员自动成为用户。
这是我当前的 models.py :
class Library(models.Model):
name = models.CharField(max_length=200)
website = models.URLField()
street = models.CharField(max_length=200)
city = models.CharField(max_length=200)
state_or_province = models.CharField(max_length=200)
postal_code = models.CharField(max_length=200)
date_registered = models.DateField(auto_now_add=True)
librarian = models.OneToOneField(User, on_delete=models.CASCADE)
@receiver(post_save, sender=Library)
def create_user(sender, instance, created, **kwargs):
if created:
User.objects.create(user=instance)
instance.user.save()
我目前在如何构建 views.py 和 forms.py 方面感到迷茫。我甚至不确定模型是否正确构建,因为我需要表单不仅包括库信息,还包括用户信息(first_name,last_name,email,password ...)。我是否需要在库模型中复制该信息才能将其传递给表单?
基本上,我没有很好地掌握如何通过Django工具和文件连接彼此的模型。如果有人能指出我正确的方向,我将不胜感激。谢谢!
答案 0 :(得分:0)
您可以使用标准django however it is quite long执行此操作。
或者您可以使用django-extra-views,让您的生活变得轻松愉快。
class LibrarianInline(GenericInlineFormSet):
model = User
fields = '__all__'
class LibraryInline(CreateWithInlinesView):
model = Library
inlines = [LibrarianInline]
fields = '__all__'
答案 1 :(得分:0)
使用标准django还有一种更简单的方法。强制首先创建库管理器,然后才允许它们创建库。
<强> urls.py 强>
urlpatterns = [
url(r'^/create-librarian$',
LibrarianCreateView.as_view(), name='create_librarian'),
url(r'^/create-library/for/(?P<librarian_id>\d+)$',
LibraryCreateView.as_view(), name='create_library'),
]
<强> views.py 强>
from django.shotcuts import reverse
from django.generic.views import CreateView
class LibrarianCreateView(CreateView):
model = User
def form_valid(self, form):
librarian = form.save(commit=True)
return redirect('create_library', {'librarian_id': librarian.id})
class LibraryCreateView(CreateView):
model = Library
def form_valid(self, form):
library = form.save(commit=False)
librarian_id = self.kwargs['librarian_id']
# You can do validation here if you fancy
library.librarian_id = librarian_id
library.save()
return self.get_success_url()
通过要求图书馆员的id创建图书馆,它可以防止在没有图书管理员的情况下创建图书馆。