gpt4 book ai didi

带有 OnetoOne 字段的 Django CreateView/UpdateView 取决于记录是否存在

转载 作者:行者123 更新时间:2023-12-04 03:10:28 31 4
gpt4 key购买 nike

我正在尝试构建一个个人资料页面,其中 User 可以填写 Teacher 模型。

我的老师模型,model.py

class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher')
rate = models.CharField(max_length=200)
availability = models.BooleanField(default=False)

表单.py

class TeacherCreate(CreateView):
user_id = request.user.id #INCORRECT! Needs something to remember current user id.
model = Teacher
fields = ['rate','availability']

编辑:我也尝试添加:

def form_valid(self, form):
form.instance.user = self.request.user
return super(TeacherCreate, self).form_valid(form)

as suggested here.

我们不允许用户在此创建 View 中更改其 ID。事实上,我认为这应该是当前用户的 id,user_idrequest.user.id 给出。

teacher_form.html

    <form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<span color="red">{{ field.errors }}</span>
<label>
{{ field.label_tag }}
</label>
<div>{{ field }}</div>
</div>
{% endfor %}
<button type="submit">Submit</button>
</form>

现在的问题是,当我运行它时,出现错误:

NOT NULL constraint failed: users_teacher.user_id

我认为这是因为我没有指定 user_id。

我希望它如何工作:

首先,检查老师是否已经在数据库中有记录。例如。如果在 Teacher 表中有一行,user_id=当前用户。

如果老师有个人资料 -> 调用更新 View 。

如果教师没有个人资料 -> 使用创建 View 。

最佳答案

尝试将 LoginRequiredMixin 添加到您的 View ,如果我理解,简单的创建或更新 View :

from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseRedirect
from django.views.generic import CreateView


class TeacherCreate(LoginRequiredMixin, CreateView):
model = Teacher
fields = ['rate','availability']

def get_success_url(self):
# replace url name 'users' on your if need
return reverse('users',args=(self.request.user.id,))

def form_valid(self, form):
user = self.request.user
instance, _ = Teacher.objects.get_or_create(user=user)
instance.rate = form.cleaned_data.get("rate", "")
instance.availability = form.cleaned_data.get("availability", "")
instance.save()
# modify return
return HttpResponseRedirect(self.get_success_url())

关于带有 OnetoOne 字段的 Django CreateView/UpdateView 取决于记录是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45773669/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com