Django формы с использованием html элементов с другим именем из поля moels - PullRequest
0 голосов
/ 15 января 2020

В моем django проекте у меня есть эта модель:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,)
    u_fullname = models.CharField(max_length=200)
    u_email = models.EmailField()
    u_profile = models.CharField(max_length=1)
    u_job = models.CharField(max_length=100, null=True, blank=True, default='D')
    u_country = models.CharField(max_length=20, null=True, blank=True, default='Italy')
    u_regdata = models.DateTimeField(auto_now=True)
    stripe_id = models.CharField(max_length=100, null=True, blank=True)
    activation_code = models.CharField(max_length=10)
    u_picture = models.ImageField(upload_to='profile_images', blank=True)
    u_active = models.BooleanField(default=False)
    u_terms = models.BooleanField(default=False)

    def __unicode__(self):
        return self.u_profile

и форма .py, как этот:

from a_profile.models import UserProfile

class ProfileModelForm (ModelForm):

class Meta:
    model = UserProfile
    fields = ['u_fullname',
              'u_job',
              'u_country',
              'u_email',
              'u_terms',
              ]

def clean(self):
    cleaned_data = super(ProfileModelForm, self).clean()
    u_fullname = cleaned_data.get('u_fullname')
    u_job = cleaned_data.get('u_job')
    u_country = cleaned_data.get('u_country')
    u_email = cleaned_data.get('u_email')
    u_terms = cleaned_data.get('u_terms')

    if not u_terms:
       raise forms.ValidationError("Please read and accept our Terms of Service")

    if not u_fullname and not u_job and not u_country and not u_terms:
        raise forms.ValidationError('You have to write something!')

    return cleaned_data

ну, теперь в html я должен использовать разные имена для элемента, связанного с полями формы:

<form action="" method="POST">
    {% csrf_token %}

    {{ form.errors }}
    <div class="row">
        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <input type="text" name="u_fullname_C" id="u_fullname_c"
                                                       placeholder="Company Name">
                                                <i class="la la-building"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <select name="u_country_c" id="u_country_c"
                                                        value="{{ form.u_country }}">
                                                    <option selected="selected">Italy</option>
                                                    <option>Spain</option>
                                                    <option>USA</option>
                                                    <option>France</option>
                                                </select>
                                                <i class="la la-globe"></i>
                                                <span><i class="fa fa-ellipsis-h"></i></span>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <select name="u_job_c" id="u_job_c" value="{{ form.u_job }}">
                                                    <option selected="selected">Technology</option>
                                                    <option>Healthcare</option>
                                                    <option>Building</option>
                                                    <option>Aerospace</option>
                                                </select>
                                                <i class="la la-industry"></i>
                                                <span><i class="fa fa-ellipsis-h"></i></span>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <input type="text" name="u_email_c" id="u_email_c"
                                                       placeholder="Enter a valid email"
                                                       value="{{ form.u_email }}">
                                                <i class="la la-envelope"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <input type="password" name="u_password_c" id="u_password_c"
                                                       placeholder="Password">
                                                <i class="la la-lock"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <input type="password" name="repeat-password_c"
                                                       id="repeat-password_c"
                                                       placeholder="Repeat Password"
                                                       onfocusout="return checkPass('C')">
                                                <i class="la la-lock"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="checky-sec st2">
                                                <div class="fgt-sec">
                                                    <input type="checkbox" name="u_terms_c" id="u_terms_c">
                                                    <label for="u_terms_c"><span></span></label>
                                                    <span></span>
                                                    </label>
                                                    <small>Yes, I understand and agree to the workwise Terms &
                                                        Conditions.</small>
                                                </div><!--fgt-sec end-->
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <button type="submit" name="company" value="submit"
                                                    onclick="return checkUserRegForm('C')">Get Started
                                            </button>
                                        </div>
                                    </div>
                                </form>

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

ERROR-> {'u_fullname': [ValidationError (['Это поле обязательно для заполнения.'])], 'u_email': [ValidationError (['Это поле обязательно для заполнения.'])], ' all ': [ValidationError (['Пожалуйста, прочитайте и примите наши Условия предоставления услуг'])]}

Как связать имя поля формы с моим html значением имени элемента?

Заранее большое спасибо

1 Ответ

0 голосов
/ 15 января 2020

Вот ссылка на документы по теме рендеринг полей вручную .

Я искал некоторое время, и вот что я придумал. Я прошу прощения, я оставил некоторые вещи. По вашему мнению, если вы можете получить параметры «кода страны» и «задания», вы можете просмотреть их в шаблоне.

Я добавил value = "{{form.u_fullname}}" и value = "{{form.u_terms}}" .

<form method="" action="">
    {% csrf_token %}

    {{ form.errors }}
    <div class="row">
        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <input type='text' name="u_fullname_C" id="u_fullname_c" 
                    value="{{ form.u_fullname }}" placeholder="">
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <select name="u_country_c" id="">
                    {% for option in options %}
                        <option value="{{ option.pk }}">{{ option.name }}</option>
                    {% endfor %}
                </select>
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <select name="u_job_c" id="u_job_c" value="{{ form.u_job }}">
                    {% for job in jobs %}
                        <option value="{{ job.pk }}">{{ job.name }}</option>
                    {% endfor %}
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <input type='text' name='u_email_c' id='u_email_c' placeholder="" value="{{ form.u_email }}">
                <i class="la la-envelope"></i>
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <input type="password" name="u_password_c" id="u_password_c" placeholder="Password">
                <i class=""></i>
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <input type="password" name="repeat-password_c" id="repeat-password_c" placeholder="" onfocusout="return checkPass('C')">
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <div class="checky-sec st2">
                <div class="fgt-sec">
                    <input type="checkbox" value="{{ form.u_terms }}" name="u_terms_c" id="u_terms_c">
                    <label for="u_terms_c"><span></span>
                        <span></span>
                    </label>
                    <small>Yes, I understand and agree to the workwise Terms &
                                                        Conditions.
                    </small>
                </div>
            </div>
        </div>

        <div class="col-lg-12 no-pdd">
            <button type='submit' name='company' value='submit' onclick="return checkUserRegForm('C')">
                Get Started
            </button>
        </div>  
    </div>
</form>

Если вы используете представление класса

class ProfileView(CreateView):
    form_class = UserProfileForm
    success_url = '/'

    def form_valid(self, form):
        user_profile = form.save(commit=False)
        user_profile.updated = datetime.datetime.now()
        user_profile.save()
        return super().form_valid(form)

Или представление функции:

def user_profile_view(request):
    if request.method == 'POST':
        form = ProfileModelForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            fullname = cd['u_fullname']
            UserProfile.objects.create(user=request.user, u_fullname=fullname)

            return redirect('')
    else:
        form = ProfileModelForm()

Сможете ли вы предоставить свой файл views.py? Я все еще новичок в Django, поэтому дайте мне знать, если у вас все еще есть проблемы.

...