#  forms.py
# encoding=utf-8
from django import forms
from django.core.exceptions import ValidationError
from users.models import Users

class UserRegisterForms(forms.Form):
    # 校验字段名与前端传来的保持一致 
    user_name = forms.CharField()
    email = forms.CharField()
    pwd = forms.CharField(min_length=6, max_length=15)
    cpwd = forms.CharField(min_length=6, max_length=15)

    def clean_user_name(self):
        name = self.data.get('user_name')
        if not name:
            raise ValidationError('username can not be none')
        return name

    def clean_cpwd(self):
        repwd = self.data.get('cpwd')
        pwd = self.data.get('pwd')
        if repwd != pwd:
            raise ValidationError('password must equal re_password')
        return repwd

    def save(self):
        name = self.cleaned_data.get('user_name')
        email = self.cleaned_data.get('email')
        user = Users.objects.create(username=name, email=email, is_active=1, is_staff=0)
        return user

    
# views.py
user_register_form = UserRegisterForms(request.POST)
if not user_register_form.is_valid():
    return JsonResponse(context)
email = user_register_form.cleaned_data.get('email')

user = None
try:
    user = user_register_form.save()
    pwd = user_register_form.cleaned_data.get('pwd')
    user.set_password(pwd)
    user.save()
except Exception as e:
    logger.error(e)
    context['msg'] = 'user create failed'
    return JsonResponse(context)





"""
在用到form表单时使用
"""
# models.py中
"""
book n: n author
book 1: n publisher
"""
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=30, verbose_name='名称')

class Publisher(models.Model):
    name = models.CharField(max_length=30, verbose_name='名称')

class Book(models.Model):
    name = models.CharField(max_length=30, verbose_name='书籍名称')
    authors = models.ForeignKey('Author', verbose_name='出版社')
    publishers = models.ManyToManyField(to=Publisher, verbose_name='作者')

# *.py中定义modelform
class BookForm(ModelForm):
    class Meta:
        model = Book  # 对应的Model中的类
        fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
        exclude = None  # 排除的字段
        help_texts = None  # 帮助提示信息
        # error_messages用法:
        error_messages = {
            'name': {'required': "用户名不能为空", },
            'age': {'required': "年龄不能为空", },
        }
        from django.forms import widgets as wid  # 因为重名,所以起个别名
        widgets = {
            #把name对应的input框渲染为Textarea
            "name": wid.Textarea(attrs={"class": "c1", "id": "name"})  #将拥有class='c1'和id=name的属性 
        }
        labels = {"name": "用户名"}  # labels 自定义在前端显示的名字






# models.py

from django.forms import ModelForm
class Book(models.Model):
    bid = models.CharField(max_length=25, verbose_name='图书编号', primary_key=True)
    name = models.CharField(max_length=25, verbose_name='图书名称', null=False)
    price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='定价')
    stock = models.IntegerField(verbose_name='库存')
    lend = models.IntegerField(default=0, verbose_name='借出数量', blank=True)
    image = models.ImageField(upload_to='images')
    publisher = models.ManyToManyField(to='Publisher')
    author = models.ManyToManyField(to='Author')
    category = models.ManyToManyField(to='Category')
    class Meta:
        db_table = 'db_book'
        verbose_name = '图书表'
        verbose_name_plural = verbose_name
    def __str__(self):
           return self.name    
    
class BookForm(ModelForm):
    class Meta:
        model = Book        # Book要先定义出来
        fields = '__all__'
        labels = {
            'publisher': '出版社',
            'image': '封面图片',
            'category': '分类',
            'author': '作者'
        }
    """
    def clean_bid(self):        # 单独校验某个字段 clean_字段名
        # print self.cleaned_data, type(self.cleaned_data)
        bid = self.cleaned_data.get('bid')
        if (bid, ) in Book.objects.values_list('bid'):
            raise ValueError('bid已存在')
        return bid"""





# views.py

forms = BookForm(request.POST, request.FILES, instance=book) # 修改book实例, 
forms = BookForm(instance=book)        #返回前端渲染
return render(request, 'books.html', {'forms': 'forms'})    

instance = BookForm(request.POST)        #用于校验post发送的数据
if instance.is_valid():        #检验数据
    data = instance.cleaned_data    #校验通过的数据
    instance.errors        #错误信息





class BookEditView(View):
    def get(self, request, bid):
        try:
            book = Book.objects.get(bid=bid)
        except Book.DoesNotExist:
            return HttpResponse("book_id does not exist")
        book_form = BookForm(instance=book)            # 返回form
        return render(request, 'book_edit.html', {"book_form": book_form})
    
    def post(self, request):
        forms = BookForm(request.POST, request.FILES)
        if forms.is_valid():
            forms.save()
         return render(request, 'book_edit.html', {"book_form": forms})
    
    def put(self, request, bid):
        try: 
            book = Book.objects.get(bid=bid)
        except Book.DoesNotExist:
            return HttpResponse("book_id does not exist")
        book_form = BookForm(request.POST, request.FILES, instance=book)    # 用前端数据修改instance
        if book_form.is_valid():        # 校验
            book_form.save()            # 入库
        return redirect(reverse('backstage:book_list'))