Python 与OneTONE/国外领域合作
我一周来一直在努力解决这个问题,我需要让它一劳永逸。这看起来像很多代码,但核心是一个简单的概念问题 我有一个模型UserProfile,它有以下字段:Python 与OneTONE/国外领域合作,python,django,Python,Django,我一周来一直在努力解决这个问题,我需要让它一劳永逸。这看起来像很多代码,但核心是一个简单的概念问题 我有一个模型UserProfile,它有以下字段: user = models.OneToOneField(User) weekOne = models.OneToOneField(WeekOne) weekTwo = models.OneToOneField(WeekTwo) WeekOne和WeekTwo都是模型,它们都有自己独特的字段(models.Model),这些字段继承自名为Week
user = models.OneToOneField(User)
weekOne = models.OneToOneField(WeekOne)
weekTwo = models.OneToOneField(WeekTwo)
WeekOne和WeekTwo都是模型,它们都有自己独特的字段(models.Model),这些字段继承自名为Week的自定义类。Week只有几个自定义函数,用于为每周保存一些重新键入的方法,以及以下代码,使其成为一个抽象类:
class Meta:
abstract = True
基本上,我希望每个用户都有一个唯一的weekOne和weekTwo(以及更高)字段,该字段具有自定义字段,这些字段的值对于用户来说是唯一的
当我第一次创建用户时(即,当他们注册时),我在views.py
中使用以下代码:
def signup(request):
user_form = UserCreateForm(data=request.POST)
if request.method == 'POST':
if user_form.is_valid():
username = user_form.clean_username()
password = user_form.clean_password2()
user_form.save()
user = authenticate(username=username, password=password)
login(request, user)
return redirect('/')
else:
return index(request, user_form=user_form)
return redirect('/')
基本的表单注册资料,这里的一切都很好
现在,事情变得很危险。我有一个weekOne视图,确保已创建用户配置文件,如果未创建,则创建一个,其代码如下:
@login_required
def workout1(request):
template = "workout1.html"
weekOne = WeekOne()
weekOne.save()
user, created = UserProfile.objects.get_or_create(user=request.user,
defaults = {'weekOne': weekOne})
name = weekOne.__unicode__()
if created:
context = {'user': user}
return render(request, template, context)
# Grab already existing User Profile
weekOne.delete() # Was never used
context = {'user': user, 'name': name}
return render(request, template, context)
好的。所以这很酷。但是,当我尝试进入第一周的页面时,出现以下错误:
workout_game_app_userprofile.weekTwo_id may not be NULL
这就是我迷路的地方。我应该为每个星期视图初始化每个星期变量吗?例如,对于“第一周”视图,我是否应该这样编写代码:
weekOne = WeekOne()
weekTwo = WeekTwo()
weekThree = WeekThree()
等等。?如果我必须在计划实施的12周内都这么做,那么这似乎是荒谬的重复
顺便说一句,在我实施第二周之前,我的模型运行得非常好
还有,OneTONE是正确的钥匙吗?我想访问user.weekOne.item1、user.weekOne.item2等,并仅为该用户更改和保存它们的值
更新
:对于Sidharth Shah,以下是我的视图和模型中的其余代码:
views.py:
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.models import User
from workout_game_app.forms import AuthenticateForm, UserCreateForm
from workout_game_app.models import WeekOne, WeekTwo, UserProfile
from django.http import Http404, HttpResponse
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from django.core import serializers
import simplejson
def index(request, auth_form=None, user_form=None):
if request.user.is_authenticated():
user = request.user
name = "Missions Overview"
context = {'user': user, 'name': name}
template = 'workouts.html'
return render(request, template, context)
else:
auth_form = auth_form or AuthenticateForm()
user_form = user_form or UserCreateForm()
template = 'index.html'
context = {'auth_form': auth_form, 'user_form': user_form}
return render(request, template, context)
def login_view(request):
if request.method == 'POST':
form = AuthenticateForm(data=request.POST)
if form.is_valid():
login(request, form.get_user())
return redirect('/')
else:
return index(request, auth_form=form)
return redirect('/')
def signup(request):
user_form = UserCreateForm(data=request.POST)
if request.method == 'POST':
if user_form.is_valid():
username = user_form.clean_username()
password = user_form.clean_password2()
user_form.save()
user = authenticate(username=username, password=password)
login(request, user)
return redirect('/')
else:
return index(request, user_form=user_form)
return redirect('/')
@login_required
def submitWorkout1(request):
if request.method == 'POST':
exercise = request.POST['exercise']
try:
amount = request.POST['amount']
except KeyError: # No amount field on form
amount = ""
user = UserProfile.objects.get(user=request.user)
week = user.weekOne
exercise, amount, exerciseComplete, allComplete = user.updateExercise(week, exercise, amount)
data = simplejson.dumps({
'result': 'success',
'exercise': exercise,
'amount': amount,
'exerciseComplete': exerciseComplete,
'allComplete': allComplete
}, indent=4)
return HttpResponse(data)
@login_required
def workout2(request):
template = "workout2.html"
weekTwo = WeekTwo()
weekTwo.save()
user, created = UserProfile.objects.get_or_create(user=request.user,
defaults = {'weekTwo': weekTwo})
name = weekTwo.__unicode__()
if created:
context = {'user': user}
return render(request, template, context)
# Grab already existing User Profile
weekTwo.delete() # Was never used
context = {'user': user, 'name': name}
return render(request, template, context)
@login_required
def submitWorkout2(request):
if request.method == 'POST':
exercise = request.POST['exercise']
try:
amount = request.POST['amount']
except KeyError: # No amount field on form
amount = ""
user = UserProfile.objects.get(user=request.user)
week = user.weekTwo
exercise, amount, exerciseComplete, allComplete = user.updateExercise(week, exercise, amount)
data = simplejson.dumps({
'result': 'success',
'exercise': exercise,
'amount': amount,
'exerciseComplete': exerciseComplete,
'allComplete': allComplete
}, indent=4)
return HttpResponse(data)
和models.py:
from django.db import models
from django.contrib.auth.models import User
class Week(models.Model):
# List of exercises by name for the week
exercises = []
# Week name in unicode
name = u''
# Running count of benchmarks met.
completeCount = models.PositiveSmallIntegerField(default=0)
# Set to true if benchmarks reached.
weekComplete = models.BooleanField(default=False)
# A bunch of methods
class WeekOne(Week):
name = u'Mission One'
exercises = ['squats', 'lunges', 'stairDaysCount', 'skipStairs']
# Required benchmarks for given exercises
squatBenchmark = 1000
lungeBenchmark = 250
stairDaysCountBenchmark = 3
totalGoals = 4
squats = models.PositiveIntegerField(default=0)
lunges = models.PositiveIntegerField(default=0)
skipStairs = models.BooleanField(default=False)
stairDaysCount = models.PositiveSmallIntegerField(default=0)
# A bunch of methods
class WeekTwo(Week):
name = u'Mission Two'
exercises = ['up3Levels', 'noHands', 'treadmill', 'vagMachine', 'extendedStairs']
totalGoals = 5
up3Levels = models.BooleanField(default=False)
noHands = models.BooleanField(default=False)
treadmill = models.BooleanField(default=False)
vagMachine = models.BooleanField(default=False)
extendedStairs = models.BooleanField(default=False)
# A bunch of methods
class UserProfile(models.Model):
user = models.OneToOneField(User)
weekOne = models.OneToOneField(WeekOne, null=True, default=None)
weekTwo = models.OneToOneField(WeekTwo, null=True, default=None)
# Some methods
而且,尽管它工作得很好,但我的forms.py是一个很好的衡量标准:
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth.models import User
from django import forms
from django.utils.html import strip_tags
class UserCreateForm(UserCreationForm):
username = forms.CharField(required=True,
widget = forms.widgets.TextInput(attrs={'placeholder': 'Username'}))
password1 = forms.CharField(required=True,
widget = forms.widgets.PasswordInput(attrs={'placeholder': 'Password'}))
password2 = forms.CharField(required=True,
widget = forms.widgets.PasswordInput(attrs={'placeholder': 'Password'}))
def is_valid(self):
form = super(UserCreateForm, self).is_valid()
for f, error in self.errors.iteritems():
if f != '__all_':
self.fields[f].widget.attrs.update({'class':'error', 'value':strip_tags(error)})
return form
class Meta:
fields = ['username', 'password1', 'password2']
model = User
class AuthenticateForm(AuthenticationForm):
username = forms.CharField(
widget = forms.widgets.TextInput(attrs={'placeholder':'Username'}))
password2 = forms.CharField(
widget = forms.widgets.PasswordInput(attrs={'placeholder': 'Password'}))
您可能需要以下模型
user = models.OneToOneField(User)
weekOne = models.OneToOneField(WeekOne, null=True, default=None)
weekTwo = models.OneToOneField(WeekTwo, null=True, default=None)
试试看,应该行得通。查看上面的代码,您正在定义字段weekOne、weekTwo等。我不确定的是,您是否在创建weekOne对象时分配了所有必需的字段 奇怪的是,当我尝试这样做时,我在尝试更新数据库后出现了此错误:
数据库错误:表“锻炼\游戏\应用\ weekone”已经存在
。我只是在处理测试数据,所以我首先使用flush
命令删除了整个数据库,然后直接删除了数据库文件——仍然会出现错误。至于WeekOne和WeekTwo中的字段,它们都有默认值。这是一个完美的用例,可以解释为什么您应该使用类似的内容。它负责您的数据库迁移。如果你不介意的话,请分享你的代码,我可以克隆并看看发生了什么?这是最糟糕的部分——我正在使用South。我更新了我的文章,在底部有我的全部视图、模型和表单。