1

我有两个模型“里程碑”和“项目”,代码如下:

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; project2 --->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'),


)

并在我的 db 在此处输入图像描述 中添加任务网站:http://127.0.0.1:8000/admin/ticket/task/add/ 在此处输入图像描述

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

更新 非常感谢。Arulmurugan,一个善良的人

4

2 回答 2

2

您可以使用 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',]

我希望这能帮到您。

于 2012-12-11T06:04:16.403 回答
0

您也可以为此使用django 动态选择

它实现了类似于 arulmr 的答案的东西,但是以一种通用的方式,您可以在 django 代码中设置映射。没有任何文档,但该项目具有良好的单元测试,并且由 django 核心开发人员编写。

于 2013-04-15T11:00:15.997 回答