我有两个模型“milestone”和“project”,代码如下:
class Project(models.Model):
ID = models.CharField(max_length=15, primary_key=True)
Name = models.CharField('Project Name', max_length=100)
ShortName = models.CharField('Project Short Name', max_length=100)
def __unicode__(self):
return self.Name
class Milestone(models.Model):
Project = models.ForeignKey(Project)
def __unicode__(self):
return self.Name
当我创建里程碑时,我可以选择一个项目,然后该里程碑就属于该项目,例如,project1---> m1;项目2 --->m2
然后在另一个模型“任务”中,我想创建一个属于特殊项目和里程碑的任务。代码如下:
class Task(models.Model):
Name = models.CharField('Title', max_length=200)
Project = models.ForeignKey(Project,null=True, blank=True)
Milestone = models.ForeignKey(Milestone,null=True, blank=True)
def __unicode__(self):
return self.Name
问题是,当我创建任务并选择项目时,里程碑字段的项目列表始终包含两个“m1”和“m2”,我希望当我选择project1时列表仅显示m1,并且当我选择project2时,列表仅显示m2。
我该如何实现这个?谢谢
已更新 我的文件夹结构
mysite_new/
manage.py
mysite/
------ __init__.py
urls.py
setting.py
wsgi.py
templates/
default.html
ticket/
------__init__.py
models.py
view.py
urls.py
admin.py
js/
---- project_change.js
在admin.py
class TaskAdmin(admin.ModelAdmin):
class Media:
js = ['js/project_change.js',]
admin.site.register(Task,TaskAdmin)
在 urls.py 中
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^admin/login', MyView().login),
url(r'^hello/', hello),
(r'^product_change/','project_choices'),
)
在我的数据库中
在添加任务网站中:http://127.0.0.1:8000/admin/ticket/task/add/
我没有更改您的任何代码,您能帮忙检查一下我的代码有什么问题吗?
更新 非常感谢。 Arulmurugan,一个善良的人
最佳答案
您可以使用 jQuery 和 Ajax 来实现这一点。尝试使用以下内容:
project_change.js
(function($){
$(function(){
$(document).ready(function() {
$('#id_Project').bind('change', project_change);
$('#id_Milestone > option').show();
if ($('#id_Project').val() != '') {
var project_id = $('#id_Project').val();
$.ajax({
"type" : "GET",
"url" : "/product_change/?project_id="+project_id,
"dataType" : "json",
"cache" : false,
"success" : function(json) {
$('#id_Milestone >option').remove();
for(var j = 0; j < json.length; j++){
$('#id_Milestone').append($('<option></option>').val(json[j][0]).html(json[j][1]));
}
}
});
}
});
});
})(django.jQuery);
// based on the project, milestone will be loaded
var $ = django.jQuery.noConflict();
function project_change()
{
var project_id = $('#id_Project').val();
$.ajax({
"type" : "GET",
"url" : "/product_change/?project_id="+project_id,
"dataType" : "json",
"cache" : false,
"success" : function(json) {
$('#id_Milestone > option').remove();
for(var j = 0; j < json.length; j++){
$('#id_Milestone').append($('<option></option>').val(json[j][0]).html(json[j][1]));
}
}
})(jQuery);
}
在views.py中包含以下内容:
from django.shortcuts import HttpResponse
from django.utils import simplejson
from ticket.models import Milestone
def project_choices(request):
milestone_list = []
project_id = request.GET.get('project_id')
milestones = Milestone.objects.filter(project = project_id)
[milestone_list.append((each_milestone.pk,each_milestone.name)) for each_milestone in milestones]
json = simplejson.dumps(milestone_list)
return HttpResponse(json, mimetype='application/javascript')
在urls.py中:
from ticket.views import project_choices
urlpatterns = patterns(
(r'^product_change/', project_choices),
)
在admin.py中,您要根据项目加载里程碑:
class Media:
js = ['/path/to/project_change.js',]
希望这对您有帮助。
关于python - 如何在django中设置两个模型之间的动态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813435/