首页 > 解决方案 > 如何将我当前的 django 应用程序转换为 REST API?

问题描述

我需要将我当前的 django 应用程序转换为 REST API,该应用程序是一个带有电子邮件和电话号码验证的 UserCreationForm。但首先我需要将文本字段注册到 django 管理站点以获得电话号码、电子邮件和密码字段。但是,在“admin.site.register(UserRegisterForm)”的 admin.py 中,当我运行 python manage.py makemigrations 时,发生错误,并指出 TypeError: 'ModelFormMetaclass' object is not iterable。我不确定 admin.site 是否不接受任何 UserForms 中的字段,它们只接受模型。这是我的代码:

/* forms.py */
import re
import phonenumbers
from phonenumbers import carrier
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from validate_email import validate_email
# from django.db import models
# from django_countries.fields import CountryField, countries
# from phonenumber_field.formfields import PhoneNumberField


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    # phone_number = PhoneNumberField()
    phone_number = forms.CharField(max_length=100)
    # country = CountryField(blank_label='Select Country').formfield()
    country = forms.CharField(max_length=2)

    class Meta:
        model = User
        fields = ['username', 'email', 'country', 'phone_number']

    def clean_email(self):
        email = self.cleaned_data.get("email")
        if not validate_email(email, check_mx=True, verify=True):
            raise forms.ValidationError("Invalid email")
        return email

    def clean_phone_number(self):
        phone_number = self.cleaned_data.get("phone_number")
        clean_number = re.sub("[^0-9&^+]", "", phone_number)
        # alpha_2 = self.cleaned_data.get("country")
        alpha_2 = self.cleaned_data.get("country")
        z = phonenumbers.parse(clean_number, "%s" % (alpha_2))
        if len(clean_number) > 15 or len(clean_number) < 3:
            raise forms.ValidationError(
                "Number cannot be more than 15 or less than 3")
        if not phonenumbers.is_valid_number(z):
            raise forms.ValidationError(
                "Number not correct format or non-existent")
        if carrier.name_for_number(z, "en") == '':
            raise forms.ValidationError("Please enter a mobile number")
        return phonenumbers.format_number(
            z, phonenumbers.PhoneNumberFormat.E164)


/* admin.py */
from django.contrib import admin
from .forms import UserRegisterForm

admin.site.register(UserRegisterForm)
# Register your models here.

请告诉我应该对我当前的代码进行哪些更改,并告诉我我做错了什么。

标签: pythondjangodjango-rest-frameworkdjango-forms

解决方案


恐怕您不能真正将表单(前端组件)“转换”为 REST-API(后端接口)。这就像让美发师用剪刀把头发剪得更长。

但是.. 您可以在新的 django-REST-project 中使用您的 models.py。

建议:

  • 启动一个新的 django 项目并添加所需的应用程序(使用 django cli)。

安装 django rest ( https://www.django-rest-framework.org/#installation )

  • pip install djangorestframework并将 ('django_rest') 添加到已安装的应用程序
    (settings.py)
  • 将代码从 model.py 复制到新应用的 model.py 中
  • 创建一个(模型)序列化程序(检查模型输入/输出的所有数据)
  • 为每个端点创建视图(这是您的界面)
  • python manage.py makemigrations
  • python manage.py migrate
  • 你现在有一个工作的rest-api!

最后:您的管理站点使您能够(视觉上)与您的模型及其数据进行交互。它适用于您网站的管理员,它不会做任何其他事情。


推荐阅读