首页 > 编程问答 >Django 管理员:一对一关系作为内联?

Django 管理员:一对一关系作为内联?

时间:2024-07-25 17:01:36浏览次数:12  
标签:python python-3.x django django-admin one-to-one

我正在为 satchmo 应用程序整理管理员。 Satchmo 使用 OneToOne 关系来扩展基本模型 Product ,我想在一页上编辑所有内容。

是否可以将 OneToOne 关系作为内联关系?如果没有,将一些字段添加到管理员的给定页面并最终保存到 OneToOne 关系中的最佳方法是什么?

例如:

class Product(models.Model):
    name = models.CharField(max_length=100)
    ...

class MyProduct(models.Model):
    product = models.OneToOne(Product)
    ...

我为我的管理员尝试过此操作,但它不起作用,并且似乎需要一个外键:

class ProductInline(admin.StackedInline):
    model = Product
    fields = ('name',)

class MyProductAdmin(admin.ModelAdmin):
    inlines = (AlbumProductInline,)

admin.site.register(MyProduct, MyProductAdmin)

这会引发此错误: <class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>

这是执行此操作的唯一方法 自定义表单

编辑: 刚刚尝试了以下代码直接添加字段...也不起作用:

class AlbumAdmin(admin.ModelAdmin):
    fields = ('product__name',)

很遗憾,Django 管理器不支持使用内联形式直接编辑 OneToOne 关系。内联仅适用于 ForeignKey 关系,其中“子”对象对“父”对象具有外键。

但是,有几种方法可以在 Django 管理器中在一页上实现类似的结果:

1. 自定义表单和 ModelForm

这是最灵活的方法,可以让完全控制表单字段和保存逻辑。

```python from django import forms from django.contrib import admin from .models import Product, MyProduct

class MyProductForm(forms.ModelForm): name = forms.CharField(max_length=100)

   class Meta:
       model = MyProduct
       fields = '__all__'

   def __init__(self, *args, **kwargs):
       super().__init__(*args, **kwargs)
       if self.instance.pk:
           self.fields['name'].initial = self.instance.product.name

   def save(self, commit=True):
       instance = super().save(commit=False)
       if 'name' in self.changed_data:
           instance.product.name = self.cleaned_data['name']
           instance.product.save()
       if commit:
           instance.save()
       return instance

class MyProductAdmin(admin.ModelAdmin): form = MyProductForm

admin.site.register(MyProduct, MyProductAdmin) ```

在这个例子中:

  • 我们创建了一个自定义表单 MyProductForm ,它包含 Product 模型的 name 字段。
  • 在表单的 __init__ 方法中,如果正在编辑现有实例,我们将 name 字段的初始值设置为相关 Product 的名称。
  • save 方法中,我们更新相关 Product name 字段。

2. 使用 inlines ,但反转关系:

虽然不能将 Product 内联到 MyProduct 中,但可以反过来做。在 Product 管理器中,可以使用内联来编辑相关的 MyProduct 对象。

```python from django.contrib import admin from .models import Product, MyProduct

class MyProductInline(admin.StackedInline): model = MyProduct

class ProductAdmin(admin.ModelAdmin): inlines = [MyProductInline]

admin.site.register(Product, ProductAdmin) ```

这种方法的缺点是将主要通过 Product 管理器界面管理 MyProduct 对象。

3. 使用自定义模板:

可以创建一个自定义 Django 管理器模板,该模板在一个页面上显示 Product MyProduct 字段。这需要更多工作,但可以让完全控制管理界面的外观和行为。

选择哪种方法取决于的具体需求和偏好。

标签:python,python-3.x,django,django-admin,one-to-one
From: 1744203

相关文章

  • 如何诊断和修复 python .\app.py 不工作
    我在vscode中激活了我的虚拟环境。在激活我的环境的PowerShell中,我成功安装了Flask。然后我在文件main.py中运行此代码:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=="__main__":......
  • 【pywpsrpc/Python】改变图片宽高报错 对象无效属性: ‘tuple‘ object has no attrib
    概要开发UOS环境下,使用Python通过pywpsrpc库操作word文档在指定段落添加指定宽高的图片时意外发现的该问题,在原作者的github提问后获得解答后记录(源码地址、对应提问链接以及相关资料链接贴在文章末尾)。原因及解决方式首先贴一段简单的代码,作用是新建一个word文档并在其......
  • Python - 如何使用存储在类变量中的类型作为同一类方法的参数的类型提示?
    考虑下面的代码:fromtypingimportProtocol,ClassVar,AnyclassTool(Protocol):t:ClassVar#deff(self,params:self.t)->Any:#NameError:name'self'isnotdefineddeff(self,params)->Any:passclassSum:......
  • 从Python列表中提取值
    代码图片我只想从.dat文件中提取单个值,到目前为止,我已经成功提取了我想要的值,但我将各个字符串添加在一起。它非常笨重,所以寻找一种更平滑的方法,它只会给我行中的第一个值(-300)。谢谢代码:current_dir=os.getcwd()work_dir="\workDir"......
  • Django 应用程序部署到 url 子目录下
    在我的服务器中,django和nginx部署在ECSFargate上并连接到负载均衡器,但是URL是由Akamai传输的https://www.example.com/company/playground/*->https://amazonloadbalancer/*但是,出现了一些问题,例如问题1静态访问https://www.exmplae.com/company/play......
  • 如何从另一个 python 文件运行一个 python 文件
    我正在尝试从另一个python运行一个python文件,但是当涉及到调用另一个python文件中的方法时,它只会重新运行当前的python文件。我尝试了这段代码。我将导入放入log_user_in方法中,因为如果我将其导入到文件顶部,则会出现循环导入错误。这是我的代码片段fromtkinter......
  • 如何在Mac电脑上安装Python 2
    Python是一种高级编程语言,广泛应用于数据科学、网络开发、人工智能等领域。本文将介绍如何在Mac电脑上安装Python2,帮助初学者快速入门。一、下载Python2安装包在Python官网上下载Python2的安装包,网址为https://www.python.org/downloads/release/python-2718/ 。下载完......
  • 我的 python 抓取数据是空的,不确定我的代码出了什么问题
    我的结果是空的,不确定我的代码出了什么问题:这里是我的代码:#尝试从该网站获取数据https://www.watsons.com.sg/health/c/2100000?currentPage=1importrequestsfrombs4importBeautifulSoupimportpandasaspd#Settingdisplayoptionsforpandaspd.......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何从另一个文件运行 python 文件
    我正在尝试从另一个名为LoginOrReg的文件运行一个名为HabitTracker的python文件,但是当我这样做时,它会重新运行LoginOrReg文件。我已经尝试过这个classLoginOrReg:def__init__(self,db,cursor,login_username,data):self.db=mysql.connector.......