Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中连接来自不同应用程序的模型?_Python_Django_Database_Django Models_Django Forms - Fatal编程技术网

Python 如何在Django中连接来自不同应用程序的模型?

Python 如何在Django中连接来自不同应用程序的模型?,python,django,database,django-models,django-forms,Python,Django,Database,Django Models,Django Forms,我在Django项目中有一些应用程序。我目前正在使用两个应用程序“应用程序”和“用户”,我有两个与模型相关的问题: 问题1: 我想以这样一种方式设计它,以便外部用户在Application/templates/Application/Apply.html上提交他们的联系表单,并将信息添加到数据库中。内部用户也可以从不同的模板添加外部用户:User/templates/User/AddNewContact.html 我可以从内部用户的角度添加新联系人: User/models.py class C

我在Django项目中有一些应用程序。我目前正在使用两个应用程序“应用程序”和“用户”,我有两个与模型相关的问题:

问题1:

我想以这样一种方式设计它,以便外部用户在
Application/templates/Application/Apply.html
上提交他们的联系表单,并将信息添加到数据库中。内部用户也可以从不同的模板添加外部用户:
User/templates/User/AddNewContact.html

我可以从内部用户的角度添加新联系人:

User/models.py

class Contact(models.Model):
    ContactName = models.CharField(max_length = 250, default='')
    ContactResidence = models.CharField(max_length = 250, default='')
    Tel = models.CharField(max_length = 250, default='')

    def get_absolute_url(self):
        return reverse('User:ContactDetails', kwargs={'pk': self.pk}
        )

    def __str__(self):
        return self.ContactName



class Locations(models.Model):
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
    Country = models.CharField(max_length=250, default='')

    def __str__(self):
        return self.Country
我本打算复制此模型并将其粘贴到Application/models.py中,但存在两个问题:

1)我不希望外部用户被定向到URL:
用户:ContactDetails
,从技术上讲,这是行不通的,因为我稍后将构建身份验证

2) 我觉得通过复制和粘贴,我打破了“不要重复自己”的规则

我应该使用外键连接两个模型吗?这种情况下的最佳实践是什么

问题2


我是否根据提供的模型处理一对多关系?我希望有一个联系人的个人信息(电话/电子邮件/地址)以及与该联系人相关的全球多个分支机构位置。

应用程序应位于同一个项目中,您可以将一个模型导入为:

import appName.models or

from appName.models import ClassName
在app2模型中,您可以在导入类后使用foreignKey或manyTomany:

from appsName.models import ClassName

class Person(models.Model):
      con = ForeignKey(ClassName)

问题1:你不需要复制粘贴模型。你可以随时使用其他django应用程序中的模型,只需导入它。基本上,你应该做的是,不要将url直接链接到应用程序应用程序中的模板,而是将其连接到视图。在视图文件中,你可以从User.models imp导入模型ort*,并正常使用它们


问题2:据我所知,您的结构提供了您想要的:一个联系人(带有个人信息)与多个国家相关。除了您应该在
contact=models.ForeignKey(Agent,on_delete=models.CASCADE)中用联系人替换代理之外

问题1:请注意,只有在视图中未提供成功url时才会调用“get\u absolute\u url”方法。如果您使用的是CreateView或FormView,则可以通过覆盖
get\u success\u url
方法来指定成功url,例如:

class ContactCreateView(CreateView):
    model = Contact
    fields = ['ContactName', 'ContactResidence', 'Tel']

    def get_success_url(self):
       if not self.request.user.internal:  # e.g. internal is a User bool field 
           return HttpResponseRedirect('some/external/url/')
       return super().get_success_url()  # call get_absolute_url model method.
干燥原则得到尊重


问题2:是的,您需要问自己的问题是“一个模型实例(在本例中为Contact)是否有另一个模型(位置)的多个实例?”?如果答案是“是”,则M2M字段应进入您的联系人模型。请参阅解释比萨饼/配料示例。

要用于一对多的关系,您可以按以下步骤操作:

在父应用程序(父表)的模型上:

在子应用程序(子表)的模型上:


它帮助了我。

如何解决
def get_absolute_url(self):return reverse('User:ContactDetails',kwargs={'pk':self.pk})的问题
?我不希望外部用户被引导到ContactDetails页面,但是,让我们假设到
Home/templates/Home.html
中的主页,您可以定义另一个方法get\u Home\u url(self),非常类似于此方法,并在需要时调用它。
class Department(models.Model):
    dept_id = models.AutoField(primary_key=True)
from appname.models import Department
class Office(models.Model):
    office_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)
    dept = models.ForeignKey(Department, on_delete=models.CASCADE)