Джанго - аргументы в форме? - PullRequest
0 голосов
/ 03 июня 2018

views.py

from django.shortcuts import render
from basic_app.forms import UserForm,UserProfileInfoForm



# Extra Imports for the Login and Logout Capabilities
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.contrib.auth.decorators import login_required

# Create your views here.
def index(request):
    return render(request,'basic_app/index.html')

@login_required
def special(request):
    # Remember to also set login url in settings.py!
    # LOGIN_URL = '/basic_app/user_login/'
    return HttpResponse("You are logged in. Nice!")

@login_required
def user_logout(request):
    # Log out the user.
    logout(request)
    # Return to homepage.
    return HttpResponseRedirect(reverse('index'))

def register(request):

    registered = False

    if request.method == 'POST':

        # Get info from "both" forms
        # It appears as one form to the user on the .html page
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileInfoForm(data=request.POST)

        # Check to see both forms are valid
        if user_form.is_valid() and profile_form.is_valid():

            # Save User Form to Database
            user = user_form.save()

            # Hash the password
            user.set_password(user.password)

            # Update with Hashed password
            user.save()

            # Now we deal with the extra info!

            # Can't commit yet because we still need to manipulate
            profile = profile_form.save(commit=False)

            # Set One to One relationship between
            # UserForm and UserProfileInfoForm
            profile.user = user

            # Check if they provided a profile picture
            if 'profile_pic' in request.FILES:
                print('found it')
                # If yes, then grab it from the POST form reply
                profile.profile_pic = request.FILES['profile_pic']

            # Now save model
            profile.save()

            # Registration Successful!
            registered = True

        else:
            # One of the forms was invalid if this else gets called.
            print(user_form.errors,profile_form.errors)

    else:
        # Was not an HTTP post so we just render the forms as blank.
        user_form = UserForm()
        profile_form = UserProfileInfoForm()

    # This is the render and context dictionary to feed
    # back to the registration.html file page.
    return render(request,'basic_app/registration.html',
                          {'user_form':user_form,
                           'profile_form':profile_form,
                           'registered':registered})

forms.py

-

from django import forms
from django.contrib.auth.models import User
from basic_app.models import UserProfileInfo

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username','email','password')


class UserProfileInfoForm(forms.ModelForm):
    class Meta():
        model = UserProfileInfo
        fields = ('portfolio_site','profile_pic')

И вотдругой файл, который я нашел в интернете.Этот код отличается от приведенного выше кода

forms.py ---- отличается

@login_required
def edit_profile(request):
    ''' edit profile view for the accounts application '''
    user = get_object_or_404(User, username=request.user)
    form = EditProfileForm(instance=user)

    print('Files : {}'.format(request.FILES)) 
    if request.method == 'POST':

        form = EditProfileForm(instance=user,
                               data=request.POST,
                               files=request.FILES
                              )

Я не понимаю, как и как аргументы могут быть переданыв формы, которые я определил.Например, я не понимаю эти строки кода:

    user_form = UserForm(data=request.POST)
    profile_form = UserProfileInfoForm(data=request.POST)

Где определен аргумент data?Точно так же в этих строках кода:

form = EditProfileForm(instance=user,
                       data=request.POST,
                       files=request.FILES
                      )

где были аргументы, instance, data, files, определены?

Я думаю, что яне хватает понимания того, как пользовательский запрос работает в сочетании с формами.

1 Ответ

0 голосов
/ 03 июня 2018

Предоставляемые вами формы: подклассы ModelForm:

class UserForm(<b>forms.ModelForm</b>):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username','email','password')

A ModelForm (и его суперклассы) представляют собой набор классов, которыереализовать некоторую привязку между экземпляром модели и Form.Например, он удостоверится, что, если экземпляр предоставлен, то элементы формы заполняются этими данными.С другой стороны, если вы предоставите данные, он может создать новый экземпляр модели и т. Д.

Если мы, например, проверяем исходный код , мы видим:

class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass):
    pass

Таким образом, в основном ModelForm наследует все от BaseModelForm, и участвует metaclass, который в основном проверяет, есть ли класс Meta в вашем Form (здесь есть),и выполните с ним некоторые действия.

Независимо от того, что делает метакласс, мы видим, что __init__ из BaseModelForm определяется как [src] :

class BaseModelForm(BaseForm):
    def __init__(<b>self, data=None, files=None, auto_id='id_%s', prefix=None,
                 initial=None, error_class=ErrorList, label_suffix=None,
                 empty_permitted=False, instance=None, use_required_attribute=None</b>):
        # ...
        pass

Поскольку мы наследуем функцию __init__, все аргументы, такие как data, files, auto_id и т. Д., Также наследуются.

...