Как разместить одну html форму данных в две модели в django? - PullRequest
0 голосов
/ 07 января 2020

У меня есть форма html, состоящая из нескольких полей с деталями, и я хочу опубликовать некоторые детали формы для одной модели и некоторые детали для другой модели, как это можно сделать? my models.py

class room(models.Model):
    id = models.IntegerField(primary_key=True)
    image = models.ImageField(upload_to='images')
    content = models.CharField(max_length=50,default='0000000')
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)



    def __str__(self):
        return self.content

# This is the model for goals   
class goal(models.Model):
    id=models.IntegerField(primary_key=True)
    goal = models.CharField(max_length=50,default='0000000')
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)

    def __str__(self):
        return self.goal

# This is the model for designs
class design(models.Model):
    id=models.IntegerField(primary_key=True)
    image = models.ImageField(upload_to='images')
    content = models.CharField(max_length=50,default='0000000')
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)


    def __str__(self):
        return self.content

# This is the model for furniture
class furniture(models.Model):
    id=models.IntegerField(primary_key=True)
    phrase=models.CharField(max_length=60,default='111111')
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)


    def __str__(self):
        return self.phrase

# This is the users model
class user(models.Model):
    username=models.CharField(max_length=20)
    email=models.CharField(max_length=50,unique=True)
    password=models.CharField(max_length=50,default='0000000')
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)

    def __str__(self):
        return self.username

class UserRequirement(models.Model):
    id=models.IntegerField(primary_key=True)
    user=models.ForeignKey(user,on_delete=models.CASCADE)
    rooms = models.ForeignKey(room,on_delete=models.CASCADE)
    goals = models.ManyToManyField(goal)
    styles = models.ManyToManyField(design)
    furn = models.ForeignKey(furniture,on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)

Мои views.py для публикации:

def user_register(request):
    if request.method == 'POST':
        user_form = UserForm(data=request.POST)
        if user_form.is_valid():
            username=request.POST["username"]
            email = request.POST['email']
            password = request.POST['password']
            rooms = request.POST['room']
            g=goals=request.POST['goal']
            g = g.split(',')
            s=styles=request.POST['style']
            s=s.split(',')
            furn=request.POST['furn']
            u = user(username=username,password=password,email=email)
            u.rooms=room.objects.get(pk=rooms)
            goals = goal.objects.filter(pk__in=g)
            styles = design.objects.filter(pk__in=s)
            u.furn = furniture.objects.get(pk=furn)
            u.save()
            u.goals.add(*goals)
            u.styles.add(*styles)
            messages.success(request,'Your project design has been registered')
            return render(request,'register.html')
        else:
            messages.warning(request,'Cant be registered this email already exists')
            return render(request,'register.html')

Моя форма. html is

<form action="{% url 'modsy:user_register' %}" method="POST">
            {% csrf_token %}
            <div class="form-group">
              <label for="username">Username</label>
              <input type="text" name="username" class="form-control" required>
              <div id="uname_error"></div>
            </div>
            <div class="form-group">
              <input type="hidden" name="room" id="name" value="">
            </div>
            <div class="form-group" >
              <input type="hidden" name="goal" id="goal" value="">
            </div>
            <div class="form-group">
              <input type="hidden" name="style" id="style" value=" ">
            </div>
            <div class="form-group" >
              <input type="hidden" name="furn" id="furn" value="">
            </div>
            <div class="form-group">
              <label for="email">Email</label>
              <input type="text" name="email" class="form-control" required><br>
              <div id="name_error" style="color:red;"></div></div>
            <div class="form-group">
              <label for="password2">Password</label>
              <input type="password" name="password" class="form-control" required>
              <div id="pwd_error" style="color:red;"></div>
            </div>
            <div class="button"><input type="submit" value="Save the Project" style="background-color:#000080;" class="btn btn-secondary btn-block" onclick="return validation(form)">
          </form>

Теперь здесь я хочу опубликуйте имя пользователя, адрес электронной почты и пароль для модели пользователя, и стиль мебели целевой комнаты пользователя должен быть сохранен в модели user_requirement, как это может быть сделано?

Мои forms.py

from django import forms
from . models import user
from django.contrib.auth.models import User
from . models import UserRequirement
from . models import room
from . models import goal
from . models import design
from . models import furniture




class UserForm(forms.ModelForm):
    class Meta:
        model = user
        fields = ('email',)

    def clean_email(self):
        # Get the email
        email = self.cleaned_data.get('email')

        # Check to see if any users already exist with this email as a username.
        try:
            match = User.objects.get(email=email)
        except User.DoesNotExist:
            # Unable to find a user, this is fine
            return email
            raise forms.ValidationError('This email address is already in use.')

class UserRequirementForm(forms.ModelForm):
    class Meta:
        model = UserRequirement
        fields=(user,rooms,goals,styles,furn)

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Опция 1 : создайте форму со всеми необходимыми полями и переопределите метод сохранения, чтобы хранить данные там, где они вам нужны. Вы можете использовать модель User в качестве базовой и добавить любые дополнительные поля, необходимые для других моделей.

Вариант 2 : использовать две разные формы и обрабатывать их отдельно.

if request.method == 'POST':
    user_form = UserForm(data=request.POST)
    user_requirement_form = UserRequirementForm(data=request.POST)
    if user_form.is_valid() and user_requirement_form.is_valid():
        user = user_form.save()
        user_requirement = user_requirement_form.save(commit=False)
        # Set user
        user_requirement.user = user
        user_requirement.save()
        user_requirement_form.save_m2m()
        redirect(...)
    else:
       # Handle errors
       messages.warning(request, 'Please correct the errors below')
else:  
    # GET
    user_form = UserForm()
    user_requirement_form = UserRequirementForm()
return render(request,'register.html', {'user_form': user_form, 'requirements_form': user_requirement_form})

Затем убедитесь, что вы действительно показываете ошибки в своем шаблоне, используя {{ user_form.errors }} или {{ user_form.email.errors }} в зависимости от того, отображаете ли вы все ошибки сразу или для каждого поля.

1 голос
/ 07 января 2020

Я думаю, что следующий подход поможет.

  1. Forms.py
class UserForm(forms.ModelForm):
    class Meta:
        model = user
        fields = ['email',]


class UserRequirementForm(forms.ModelForm):
    class Meta:
        model = UserRequirement
        fields=['rooms','goals','styles','furn']

Тогда 2. Views.py

from .forms import UserForm, UserRequirementForm
from django.shortcuts import redirect, render

def register_user(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        user_requirement_form = UserRequirementForm(request.POST)

        if user_form.is_valid() and user_requirement_form.is_valid():
            user = user_form.save()
            user_requirement = user_requirement_form.save(commit=False)

            user_requirement.user = request.user # <- Setting the user to currently logged in user
            user_requirement.save()
            redirect('name_of_url_to_redirect_to')

    else:
        user_form = UserForm()
        user_requirement_form = UserRequirementForm()

    context = {
        'user_form': user_form,
        'user_requirement_form' : user_requirement_form,
    }

    return render(request, 'path_to_template.html', context)

Затем, наконец, в шаблоне (. html файл):

<form method="POST">
    {{user_form.as_p}}
    {{user_requirement_form.as_p}}

    <button type="submit"> Submit</button>
</form>

Это должно сделать вашу форму и правильно сохранить данные при отправке

PS: Избегайте добавления поля id на вашем модели с номером Django по умолчанию уже предоставляют поле идентификатора.

...