【问题标题】:django foreignkey dropdown redirect to html pagedjango外键下拉重定向到html页面
【发布时间】:2016-05-30 05:49:47
【问题描述】:

我正在尝试创建一个具有单个下拉输入的 django 页面,它引用包含数千个条目的数据库,当用户选择其中一个项目并点击“提交”时,它会将它们重定向到一个 html 页面生成他们选择的项目的统计信息。我已经尝试了几件事,但没有得到任何工作,我尝试过的最新事情是我在这里找到的,虽然我也无法让它工作,它向我抛出了这个错误:“局部变量” team_number' 在分配前引用”

views.py:

def team_stats(request):
    if request.method == 'POST':
        team_number = TeamStats(request.POST, request.FILES)
        if team_number.is_valid():
            # do stuff & add to database
            team_number.save()
            team_number = TeamStats.objects.create()
            # use my_file.pk or whatever attribute of FileField your id is
            # based on
            return HttpResponseRedirect('/team-stats/%i/' % team_number.pk)

    return render_to_response('team-stats.html', {
        'team_number': team_number,
    })

forms.py:

class TeamStats(forms.ModelForm):
    model = Team
    fields = 'team_number'

models.py:

class Team(models.Model):
    team_number = models.IntegerField()
    team_notes = models.CharField(max_length=150)
    event_id = models.ForeignKey(
        'Event', on_delete=models.CASCADE, unique=False)

    def __unicode__(self):
        return str(self.team_number)

    class Meta:
        db_table = 'teams'
        app_label = 'frcstats'

我希望我所寻求的帮助是有意义的。如果没有,我会尝试更好地解释它。谢谢

【问题讨论】:

  • 你报告的问题是你从来没有设置team_number 如果方法没有发布,真正的问题可能是别的东西,你能显示你的表单模板吗?
  • 您的视图缺少 GET 部分。下拉菜单可能返回一个 GET 请求,跳过 POST 部分,然后返回语句抛出错误 - 变量未定义,因为它是 GET

标签: python html django redirect django-forms


【解决方案1】:

我注意到有几件事是错误的,但导致问题的一个是如果该方法未发布,则您永远不会将 team_number 设置为某个值,因此您不应将其包含在上下文数据中

我还更改了您的视图以使用 View 类而不是基于函数的视图,这将允许视图针对不允许的请求引发不允许的响应

from django.views.generic import View
class TeamStatsView(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'team-stats.html',
                      {'team_number': TeamStats()})

    def post(self, request, *args, **kwargs):
        team_number = TeamStats(request.POST, request.FILES)
        if team_number.is_valid():
            # do stuff & add to database
            team_number.save()
            team_number = TeamStats.objects.create()
            # use my_file.pk or whatever attribute of FileField your id is
            # based on
            return HttpResponseRedirect('/team-stats/%i/' % team_number.pk)
        return render(request, 'team-stats.html', {'team_number': team_number })

要使用它,您必须更改 url 的目标,

 url('your_url_regex', TeamStatsView.as_view(), name='should be here'),

我还更改了您的代码以使用 render 而不是 render_to_response,因为后者不使用请求并且可能会被删除


编辑后的版本现在返回错误“ModelForm 没有指定模型类”。

那是因为模型需要在表单的元数据上设置

class TeamStats(forms.ModelForm):    
    class Meta:
        model = Team
        fields = ['team_number']

【讨论】:

  • 所以这似乎在大多数情况下都有效,尽管它没有显示下拉菜单来选择 team_number 并提交
  • @alicen - 我已经编辑了我的答案来猜测你的意思。在 get 方法中查看上下文数据。很难说如何解决这个问题。
  • 哪一部分没有意义?编辑后的版本现在返回错误“ModelForm has no model class specified。”
  • @alicen - 我已经更新...如果您遇到任何其他错误,如果您无法解决问题,可能值得创建一个新问题
  • 解决了错误,但 team_number 的下拉菜单仍然没有显示在 team-stats.html 页面中。我应该为此提出一个新问题吗?
猜你喜欢
  • 2013-07-12
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2011-05-26
  • 2016-09-18
  • 2013-05-31
相关资源
最近更新 更多