首页 > 解决方案 > 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但它说没有这样的字段。我真的很感激任何帮助!

标签: django

解决方案


试试下面的检查清单。我希望它可以帮助你。

设置.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)

推荐阅读