将值传递给自定义函数?django noob

将值传递给自定义函数?django noob,django,django-models,django-admin,Django,Django Models,Django Admin,我有一个函数,如果我从django shell运行,它会成功地填充我的db 我有三节课 Class League(models.Model): LeagueName = models.CharField() #class League explained below Class Fixture(models.Model): League = models.ForeignKey(League) home_team = models.ForeginKey(Team

我有一个函数,如果我从django shell运行,它会成功地填充我的db

我有三节课

Class League(models.Model):
    LeagueName = models.CharField()
    #class League explained below


Class Fixture(models.Model):
    League = models.ForeignKey(League)
    home_team = models.ForeginKey(Team)
    away_team = models.ForeginKey(Team)

Class Teams(models.Model):
    League = models.ForeignKey(League)
我希望该功能能够计算关于一个联赛的赛程表。这就是我现在正在做的。但目前它并没有这样做。怎么做

class League(models.Model):
    LeagueName = models.CharField(max_length=200)
    FixturesGenerated = models.BooleanField(default=False)

    def __unicode__(self):
        return self.LeagueName

    def CreateFixtures(self, print_only=True):
        if self.FixturesGenerated==True:
            return

        from dateutil import rrule
        from dateutil.relativedelta import *
        from League.models import Team, Fixture
        import itertools
        import datetime
        import random

        """
        Instead of your array I will use actual objects from the Teams model
        """
        teams = Team.objects.all()

        fixcombos = list(itertools.combinations(teams,2))
        random.shuffle(fixcombos)

        nofixtures = len(fixcombos)

        datestart = datetime.date.today()
        dateend = datestart + datetime.timedelta(days=125)
        #calculate possible fixture dates,
        fixdays = list(rrule.rrule(rrule.DAILY, byweekday=(rrule.SA,rrule.SU), dtstart=datestart, until=dateend))
        nofmatchdays = len(fixdays)

    # perday = perday matches, and then moved it into array for for loop of dates available.
        perday = nofixtures/nofmatchdays +1
        perday = range(0,perday)

        #for loop to extend the fixture days array to repeat dates.
        for x in perday:
            fixdays = fixdays + fixdays

        fixarray = range(0, nofixtures)

        # for loop for printing the possible functions
    # this for loop number will give the database entry id number of a particular name. we still have to do some manipulation.
        result = ''
        for y in fixarray:
            printline = 'Date: ' + str(fixdays[y]) + ': Teams Involved: ' + str(fixcombos[y])
            result += printline
            # now the print array functionality needs to be replaced with p.save() functionality in the final program.
        """
            Code to actually save the fixture if print_only is not True
            """
            if not print_only:
                f = Fixture()
                f.league = self
                f.fixture_date = fixdays[y]
                f.team_one = fixcombos[y][0]
                f.team_two = fixcombos[y][1]
                f.save()
        self.FixturesGenerated = True
        self.save()
[编辑]为了进一步说明,这里是我的admin.py

from League.models import League
from League.models import Team
from League.models import Fixture
from django.contrib import admin

from django.http import HttpResponseRedirect
class ButtonableModelAdmin(admin.ModelAdmin):
    buttons=()

    def change_view(self, request, object_id, extra_context={}): 
        extra_context['buttons']=self.buttons 
        return super(ButtonableModelAdmin, self).change_view(request, object_id, extra_context)

    def button_view_dispatcher(self, request, object_id, command): 
        obj = self.model._default_manager.get(pk=object_id) 
        return getattr(self, command)(request, obj)  \
            or HttpResponseRedirect(request.META['HTTP_REFERER'])

    def get_urls(self):

        from django.conf.urls.defaults import patterns, url
        from django.utils.functional import update_wrapper

        def wrap(view):
            def wrapper(*args, **kwargs):
                return self.admin_site.admin_view(view)(*args, **kwargs)
            return update_wrapper(wrapper, view)

        info = self.model._meta.app_label, self.model._meta.module_name

        return patterns('',
            *(url(r'^(\d+)/(%s)/$' % but[0], wrap(self.button_view_dispatcher)) for but in self.buttons)
        ) + super(ButtonableModelAdmin, self).get_urls()

class TeamsInLeague(admin.StackedInline):
    model = Team
    extra = 1

class FixturesInLeague(admin.TabularInline):
    model = Fixture
    extra = 0

class LeagueAdmin(ButtonableModelAdmin):
    fields = ['LeagueName', 'FixturesGenerated']
    inlines = [TeamsInLeague, FixturesInLeague, ]
    def gen_fixtures(self, request, obj):          
        obj.CreateFixtures(print_only=False) 
    gen_fixtures.short_description = 'Generate Fixtures'
    gen_fixtures.url = "gen_fixtures"
    buttons = [ (gen_fixtures.func_name, gen_fixtures.short_description) ]

admin.site.register(League,LeagueAdmin)
admin.site.register(Team)
admin.site.register(Fixture)
这是我的templates/./change\u form.html中的内容

{% extends "admin/change_form.html" %}
 {% block object-tools %}
 {% if change %}{% if not is_popup %}
 <ul class="object-tools">
 {% for button in buttons %}
    <li><a href="{{ button.0 }}/">{{ button.1 }}</a></li>
 {% endfor %}
 <li><a href="history/" class="historylink">History ala bala</a></li>
 {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">View on site</a></li>{% endif%}
 </ul>
 {% endif %}{% endif %}
 {% endblock %}
{%extends“admin/change\u form.html”%}
{%block object tools%}
{%if change%}{%if不是_popup%}
    {按钮%中的按钮为%s}
  • {%endfor%}
  • {%if有绝对url%}
  • {%endif%}
{%endif%}{%endif%} {%endblock%}
谢谢

//鼠标

我的建议(在尽我所能理解您试图做什么之后)是让您的锚使用团队id的get参数

{% for button in buttons %}
    <li><a href="{{ button.0 }}?team_id={{team_id}}/">{{ button.1 }}</a></li>
 {% endfor %}

根据你粘贴的代码,这是我能做的最好的了。我强烈建议您修改其中一些内容,使其更具可读性。

它没有做什么?告诉我们你怎么称呼它。添加了my admin.py。。现在,当我点击按钮生成fixture时,它会从团队表中获取所有团队。我只想把联盟的同事带到特定的联盟。在DjangoAPI中,它应该是
p=League.objects.get(id=?)
。。其中id应该是动态的,按钮应该设置它。然后
p.team\u set.all()
。。我希望我的按钮传递团队id值,然后我会相应地调整我的功能。。而不是执行Team.objects.all()…您需要将其简化为基本代码。这是一个相当数量的代码供某人使用。
team = request.get('team_id')
league.CreateFixtures(team, print_only=False)