我在管理面板中有一个关于外键的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有点陌生。非常感谢!
发布于 2014-05-02 13:15:12
将模型结构更改为:
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)ManyToManyField将执行与DriverAssignment表相同的工作。
您可以在“可用驱动程序”字段中添加可用驱动程序。
,但是您也希望bound_driver是可用的驱动程序之一,。您必须在表单中进行此验证。为此,你必须通过行政管理表格。见链接
参考链接:
ManytoMany字段: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
如果你想学到更多的东西,你将不得不花一些时间阅读和实现。:)
或
如果您想使用相同的结构,则必须在form in ModelAdmin中使用这里并提供自定义表单,如下所示:
class CustomForm(ModelForm)
bound_driver = forms.ModelChoiceField(queryset = <your custom queryset that returns only available drivers>, ...)
class Meta:
model = Devicehttps://docs.djangoproject.com/en/1.6/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form
发布于 2016-07-05 12:53:54
代表Django >1.8
使用InlineModelAdmin (文档为2.2),在这里解释如下:
models.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)admin.py
from django.contrib import admin
class BookInline(admin.TabularInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
inlines = [
BookInline,
]发布于 2014-07-14 09:45:25
反行内嵌有一个片段。如果您仍然需要它,您可以尝试如下: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.https://stackoverflow.com/questions/23428717
复制相似问题