Django - 从另一个使用User作为OneToOne的模型创建用户实例

时间:2018-01-26 01:52:53

标签: python django django-models django-forms

我认为一个例子可以更好地解释它。

让我们说我正在为各种图书馆申请展示他们有哪些书籍。

该网站将拥有通过内置用户注册系统和用户模型注册的用户。这些用户(想象它像图书馆成员一样)可以访问图书馆并浏览和查看可用的图书。

该网站还允许图书馆自行注册,部分注册正在宣布“图书管理员”,#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工具和文件连接彼此的模型。如果有人能指出我正确的方向,我将不胜感激。谢谢!

2 个答案:

答案 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创建图书馆,它可以防止在没有图书管理员的情况下创建图书馆。