django - Django 无法从 DetailView 更新另一个模型
问题描述
我一直试图在 DetailView 中构建一个验证表单,它将参数与标志键进行比较,如果正确,它将更新另一个模型中的某些字段(分数字段)。此视图存在于 Django 应用程序(“挑战”)中,它呈现给定应用程序的模型。但是我想从另一个模型中更改两个字段。另一个模型存在于另一个应用程序中(“帐户”。但是我无法从第二个模型中选择我想要的字段。我得到一个 ObjectDoesNotExist 异常
u= User.objects.get(pk=self.request.user.pk
不管我知道它在那里。
令人不安的班级:
class ChallengeDetailView(FormMixin,DetailView):
model = Challenge
form_class = FlagForm
def get_success_url(self):
return reverse('challenges:challenge_detail', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = self.get_form()
return context
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
f=form.cleaned_data['flag']
if f==self.object.flag:
try:
u= User.objects.get(pk=self.request.user.pk)
ch=Challenge.objects.get(flag=f)
request.user.score+=ch.point
except ObjectDoesNotExist as e:
pass
return super().form_valid(form)
也许模型也可能像 FlagForm 一样有帮助:
class FlagForm(forms.Form):
flag = forms.CharField()
用户模型:
class User(auth.models.User, auth.models.PermissionsMixin):
score = models.IntegerField(default=0)
def __str__(self):
return self.username
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
挑战模式:
class Challenge(models.Model):
title = models.CharField(max_length=200)
text = models.TextField()
url = models.URLField(max_length=200,null=False)
created_date = models.DateTimeField(default=timezone.now)
points = models.IntegerField(default=0)
flag = models.CharField(max_length=100)
def get_absolute_url(self):
return reverse("challenges:challenge_detail",kwargs={'pk':self.pk})
def __str__(self):
return self.title
我也尝试通过与 User 模型进行交互,self.request.user.score
但它说没有这样的字段。我真的很感激任何帮助!
解决方案
试试下面的检查清单。我希望它可以帮助你。
设置.py
# ....
AUTH_USER_MODEL = 'myapp.User'
# ....
模型.py
class User(auth.models.AbstractUser):
score = models.IntegerField(default=0)
def __str__(self):
return self.username
视图.py
def form_valid(self, form):
f=form.cleaned_data['flag']
if f == self.object.flag:
ch = Challenge.objects.get(flag=f)
self.request.user.score += ch.point
self.request.user.save()
return super().form_valid(form)
推荐阅读
- reactjs - 具有 React 顺序的 Django Rest Framework 不起作用
- python - 检查行是否存在于csv Python中
- python - BaseDatabaseOperations 的子类可能需要 datetime_extract_sql() 方法
- android - 如何使用刀柄将 jetpack 组合中的“rememberNavController”注入到活动中?
- docker - Docker 中的 Nginx 看不到文件夹中正在创建的文档
- ios - StackView 布局不正确
- javascript - 如果生成的值,如何在发布请求时强制手动设置 id
- r - 在 R 中按 2 列分组/聚合
- sql - SQL SERVER - 我在哪里把这些行放在我的表中?
- ios - Firebase 动态链接未在 ios 应用程序中处理