gpt4 book ai didi

python - 如何在django中设置两个模型之间的动态映射

转载 作者:行者123 更新时间:2023-12-01 05:52:10 25 4
gpt4 key购买 nike

我有两个模型“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'),


)

在我的数据库中 enter image description here在添加任务网站中:http://127.0.0.1:8000/admin/ticket/task/add/ enter image description here

我没有更改您的任何代码,您能帮忙检查一下我的代码有什么问题吗?

更新非常感谢。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com