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

标签 python django

我有两个模型“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/

相关文章:

python - ivot_table() 到 df 没有要聚合的数字类型

Django:做复杂注释和聚合的问题

javascript - 使用闭包编译器缩小包含 Jinja2 表达式的 JavaScript 代码

python - 将 python venv 部署为 snap

django - 部署使用 South 开发的 Django 应用程序堆栈?

Django 翻译成自定义语言在开发中有效,但在生产中无效

python - 使用 AWS 部署 Django

javascript - 从 Django 后端使用 Javascript 加载多个图像

python - 使用 Haystack 的 Django ListView 速度非常慢

python - 使用 'tarfile' 时跳过损坏的文件 (.tar.gz)