正确使用 get_or_create?

Posted

技术标签:

【中文标题】正确使用 get_or_create?【英文标题】:correct using get_or_create? 【发布时间】:2022-01-03 04:26:31 【问题描述】:

对于我的代码,它从表单记录一个联系人并将其添加到数据库中,需要添加get_or_create,或者写另一个条件(如果有这样一个电话的联系人-更新,没有-添加),但是我我是第一次做,拜托,我很高兴阅读我的问题的解决方案和简要说明♡

views.py

from django.http import HttpResponse

from django.shortcuts import render,redirect
from django.contrib import messages
from .forms import Forms

def main(request):
form = Forms
if request.method == "POST":
form = Forms(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'Form has been submitted')
return redirect('/')

return render(request, 'app/main.html',  'form':form  )

forms.py

from django.forms import ModelForm
from .models import Form

class Forms(ModelForm):
class Meta:
model = Form
fields = '__all__'

urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('app.urls'))

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)


models.py

from django.db import models

class Form(models.Model):
name = models.CharField(max_length=30)
phone = models.CharField(max_length=30)

admin.py

from django.contrib import admin
from .models import Form
'''from django.contrib.admin.models import LogEntry
LogEntry.objects.all().delete()'''
'''for delete actions in admin_panel'''
admin.site.register(Form)

apps.py

from django.apps import AppConfig

class AppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app'

main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTE-8">
    <meta name="viewport" content="width, initial-scale=1.0">
<title>CHECK DATA</title>
</head>
<body>
    % for message in messages %
        <p>message</p>
    % endfor %
    <form action="" method="post">
    % csrf_token %
        <table>
            form.as_table
            <tr>
                <td colspan="2">
                    <input type="submit"/>
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

【问题讨论】:

【参考方案1】:

您可以通过以下方式实现:

def main(request):
    if request.method == "POST":
        form = Forms(request.POST)
        if form.is_valid():
            Form.objects.get_or_create(
                phone=form.cleaned_data['phone'],
                defaults='name': form.cleaned_data['name']
            )
            messages.success(request, 'Form has been submitted')
            return redirect('/')
    else:
        form = Forms()
    return render(request, 'app/main.html',  'form': form )

但是,您必须小心,因为这意味着用户可能会编辑另一个用户的数据。因此,也许值得检查(登录的)用户是否有权更新该项目。

【讨论】:

我有个问题,请帮帮我...如果我需要在表单中添加另一个值,例如“电子邮件”,那么如何补充视图中的代码? 如果我写 Form.objects.get_or_create( phone=form.cleaned_data['phone'], email=form.cleaned_data['email'], defaults='name': form.cleaned_data['name'] ) ,则会出现 100500 错误:(

以上是关于正确使用 get_or_create?的主要内容,如果未能解决你的问题,请参考以下文章

使用 get_or_create 返回的 MultipleObjects

django - 使用 get_or_create 自动创建用户时设置用户权限

与 iexact 一起使用时,Django get_or_create 无法设置字段

Django - SQL 批量 get_or_create 可能吗?

get_or_create() 问题

使用 User.objects.get_or_create() 在 django 中给出无效的密码格式?