使用post请求更新并保存django中的dict



我正试图用python/django制作一个响应锦标赛括号,并使用$.post请求更新锦标赛dict-我将其作为字典传递到"括号"模板,渲染,然后按$更新。将传递的变量发布到另一个视图,该视图更新、保存到服务器,然后重定向到"支架"视图。

我刚开始取得一些进展,但在重新格式化括号对象时遇到了问题。

更多细节

括号是在python(在我的views.py中(中的括号视图中初始化的,但我在视图中调用了我从这里得到的Tournament类。

Tournament类获取玩家列表,然后使用方法t.generate_bracket((生成与游戏相对应的字典。

我对其进行了某种重组,然后将其传递到括号视图中进行显示-我在模板中显示重组后的数组,但也传递未重组的一个

我有一些小单选按钮绑定到$.post的"update_brack"视图。在JS$.post中,我将数组发送到视图,在那里我将调用t.play_game((方法来更新括号。然后,我将更新后的括号保存到员工模型上的JSONField(扩展登录用户(,HTTPResponseRedirect到初始的"括号"视图,在那里我要检查员工是否保存了括号,然后使用保存到JSONField的值作为要显示的新括号dict,而不是使用t.generate_bracket((从头开始生成

这是我的括号视图,我的更新括号视图,用json$.post((更新_brack的括号.html,以及我正在使用的一些锦标赛和其他类

代码

初始括号视图

@login_required#(login_url='/accounts/login/')
def bracket(request):
'''
:param request:
:return:
'''
emp = Employee.objects.get(user = request.user)
emp_bracket = emp.guess
players = [p.id for p in Pet.objects.all()]
t = Tournament(players)
if not emp_bracket:
t.generate_bracket('single', 0)
else:
t.games = emp_bracket
tournament_games = t.games
nested_tournament_games = {}
nested_tournament_games['rounds']={}

for g_id,g in tournament_games.items():
#....I do restructuring of the tournament_games dict
context = {'arr':tournament_games, 'nested':nested_tournament_games['rounds']}#{'latest_question_list': latest_question_list}
return render(request, 'madness/bracket.html', context)

.括号中的帖子模板

$('input[type=radio][name=bStatus]').change(function() {
alert(this.value);
$.post('{% url "update_bracket"  %}',
{ bracketData: JSON.stringify("{{arr}}") },
function(data, status, xhr) {
console.log(JSON.stringify(data));
var nested = JSON.stringify(data);
}).done(function() {  })
.fail(function(jqxhr, settings, ex) { alert('failed, ' + ex); });
});

更新球拍视图

@csrf_exempt
def update_bracket(request):
bracketData = request.POST['bracketData']
print(json.loads(bracketData))
#I plan on using the play_game() method here, but first I have to just get the basics down
emp = Employee.objects.get(user = request.user)
emp.guess = bracketData
emp.save()
# return HttpResponse(json.loads(bracketData))
return HttpResponseRedirect(reverse('bracket'))

锦标赛类我正在使用

class Tournament:
def __init__(self, players):
self.players = players
self.player_count = len(players)
self.games = {}
...

def generate_bracket(self, bracket_class, randomize):
if bracket_class != "single":
print("Illegal bracket class")
quit()
self.n_size = int(math.ceil(math.log(self.player_count, 2)))
self.underflow = int(math.pow(2, self.n_size) - self.player_count)
if randomize:
random.shuffle(self.players)
for i in range(self.underflow):
self.players.append(None)
self.num_of_rounds = int(math.log(len(self.players), 2))
self.games = generate_bracket_rec(self.players, self.num_of_rounds)

...
def generate_bracket_rec(players, num_of_rounds):
games_map = {}
next_players = []
assert len(players) > 0
if len(players) == 1:
return games_map
gm=1
for i in range(int(len(players) / 2)):
player1_id = i
player2_id = len(players) - 1 - i
if players[player2_id] is None:
next_players.append(players[player1_id])
else:
round=str(1+num_of_rounds-int(math.log(len(players), 2)))
game_id = "round_"+round + "_game_" + str(gm)#str(i + 1)
g = Game((players[player1_id], players[player2_id]), game_id)
g.round, g.game = round, gm
games_map[g.id] = g#{'players':g.players, 'winner':g.winner, 'loser':g.loser, 'done':g.done}
# next_players.append((g, "winner"))  #the winner of that game
# next_players.append('winner of %s and %s' % (g.players))
next_players.append('winner of Round %s Game %s' % (g.round, g.game))
gm += 1
d = {}
d.update(games_map)
d.update(generate_bracket_rec(next_players, num_of_rounds).items())
return d

格式化错误

我尝试了不同的方法来处理JSON锦标赛对象,现在我在$.post-Uncaught SyntaxError中的js中出现了错误:无效或意外的令牌,因此代码甚至无法到达update_brack视图。

DevTools显示

$.post('/update_bracket',
{ bracketData: JSON.stringify("{'round_1_game_1': round_1_game_1: 2 vs 3
Done: False, 'round_2_game_1': round_2_game_1: 1 vs winner of Round 1 Game 1
Done: False}") },

有人知道我需要如何在的生命周期中处理这个锦标赛对象吗

python(生成为dict(-->模板(作为上下文var传入(-->python(从传递到模板var的.post(-->保存到从JSONField检索的django JSONField-->(循环的重新启动(

EDIT-JSON解码错误

在遵循了传递到模板的建议之后,我在update_brack中得到了一个新的错误。我可以将数据发送到那里,但当我尝试加载((时,我会收到JSONDecode错误。你知道我该怎么处理吗?

request.POST['bracketData']
'{"round_1_game_1": {"players": [2, 3], "winner": null, "loser": null, "done": false}, "round_2_game_1": {"players": [1, "winner of Round 1 Game 1"], "winner": null, "loser": null, "done": false}}'
json.loads(request.POST['bracketData'])
Traceback (most recent call last):
File "C:Program FilesJetBrainsPyCharm Community Edition 2019.2.1helperspydev_pydevd_bundlepydevd_exec2.py", line 3, in Exec
exec(exp, global_vars, local_vars)
File "<input>", line 1, in <module>
File "C:UsersaidenAppDataLocalProgramsPythonPython37-32libjson__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:UsersaidenAppDataLocalProgramsPythonPython37-32libjsondecoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:UsersaidenAppDataLocalProgramsPythonPython37-32libjsondecoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

当您在模板中执行{{ arr }}时,您只是告诉python将arr对象打印为字符串。由于arr是一个字典(它是tournament_games(,所以您打印的是类似{'key': 'value'}的内容,而不是JSON字符串(JSON字符串需要双引号"(。

然后你把它包装在""中,使它成为一个javascript字符串,然后你的javascript调用它的JSON.stringify()。但这不起作用,因为stringify()需要一个javascript对象,而不是字符串。

由于您只需要发布一个JSON字符串,请在python中创建该字符串并将其打印到模板中。在您的背景下:

'arr': json.dumps(tournament_games)

并且在您的模板中:

bracketData: "{{ arr }}"

最新更新