admin中的Django reverse外键

2024-06-26 14:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于管理面板外键的Django相关问题。我面临以下情况:

class Driver(models.Model):
    name = models.CharField(max_length=200)
    executable = models.CharField(max_length=200)

class Device(models.Model):
    name = models.CharField(max_length=200)
    bound_driver = models.ForeignKey(Driver)

class DriverAssignment(models.Model):
    device = models.ForeignKey(Device)
    driver = models.ForeignKey(Driver)

每个设备都需要有一个绑定的驱动程序(它使用这个驱动程序)。DriverAssignment应该是显示哪个驱动程序可以被哪个设备使用的表。所以一个设备可以有多个驱动程序,这些驱动程序可以被绑定。现在我想在我的管理面板上有一个下拉列表,显示特定设备的所有可能驱动程序,以选择“绑定驱动程序”。在

在Django我该怎么做?对于一个有经验的Django人来说,这可能是件容易的事。我希望有人能给我一个暗示,因为我对Django还是个新手。谢谢!在


Tags: djangoname面板modelmodelsdevicedriver驱动程序
3条回答

这里有一个反向内联的片段。如果你还需要它,你可以试试这个: https://gist.github.com/mzbyszewska/8b6afc312b024832aa85

我曾在django 1.5和1.6的OneToOneField中使用过它。不幸的是,我没有针对ForeignKeyField测试它,但是之前的一个用户声称它也适用于ForeignKeyField。在

代码片段的最佳描述包含在其中。Person类是您的DriverAssignment类,设备与下面示例中的Address类相对应:

Example:

    from django.db import models
    class Address(models.Model):
        street = models.CharField(max_length = 255)
        zipcode = models.CharField(max_length = 10)
        city = models.CharField(max_length = 255)
    class Person(models.Model):
        name = models.CharField(max_length = 255)
        business_addr = models.ForeignKey(Address,
                                             related_name = 'business_addr')
        home_addr = models.OneToOneField(Address, related_name = 'home_addr')
        other_addr = models.OneToOneField(Address, related_name = 'other_addr')



You use reverseadmin in the following way:

    from django.contrib import admin
    from django.db import models
    from models import Person
    from reverseadmin import ReverseModelAdmin
    class AddressForm(models.Form):
        pass
    class PersonAdmin(ReverseModelAdmin):
        inline_type = 'tabular'
        inline_reverse = ('business_addr', ('home_addr', AddressForm), ('other_addr' (
            'form': OtherForm
            'exclude': ()
        )))
    admin.site.register(Person, PersonAdmin)

inline_type can be either "tabular" or "stacked" for tabular and
stacked inlines respectively.

对于Django>;1.8

使用InlineModelAdmin(docs for 2.2)如下所述:

在模型.py

from django.db import models

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

class Book(models.Model):
   author = models.ForeignKey(Author, on_delete=models.CASCADE)
   title = models.CharField(max_length=100)

在管理员py

^{pr2}$

将模型结构更改为:

class Driver(models.Model):
    name = models.CharField(max_length=200)
    executable = models.CharField(max_length=200)

class Device(models.Model):
    name = models.CharField(max_length=200)
    bound_driver = models.ForeignKey(Driver, related_name="bound_to")
    available_drivers = models.ManyToManyfield(Driver)

许多人会做同样的工作作为司机信号表。在

您可以在Available drivers(可用驱动程序)字段中添加可用驱动程序。

但您也希望绑定的驱动程序是可用的驱动程序之一。您必须在表单中进行验证。为此你必须超越管理表格。查看链接

参考链接:

多个字段https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ManyToManyField

模型管理(超越管理功能)https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#modeladmin-objects

如果你不想学到更多的东西,你必须花一些时间阅读和执行。:)

如果您想使用相同的结构,那么您就必须超越ModelAdmin中的form,请参见here并为您提供自定义表单,如下所示:

^{pr2}$

https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

相关问题 更多 >