【问题标题】:Forms in Django. How to initialize model field from form?Django 中的表单。如何从表单初始化模型字段?
【发布时间】:2015-06-22 04:42:00
【问题描述】:

在models.py中:

class Client(AbstractBaseUser):

    username = models.CharField(max_length=32, unique=True)
    email = models.EmailField('email address', unique=True, db_index=True)
    avatar = models.ImageField('avatar', upload_to='avatars')
    id = id(object)

class Order(models.Model):
    class Meta():
        db_table = 'order'

    short_desc = models.CharField(max_length=30)
    subject = models.ForeignKey(Subject, blank=True)
    user_id = models.ForeignKey('Client', to_field='id', related_name='client_id', default='0', blank=True)
    performer_id = models.ForeignKey('Client', to_field='id', related_name='performer_id', default='0', blank=True)
    worktype = models.ForeignKey(Type, blank=True)
    level = models.IntegerField(default=0, blank=True)
    readiness = models.BooleanField(default=False, blank=True)
    description = models.TextField(max_length=2000, blank=True)
    file = models.FileField(upload_to='orderfiles', blank=True)
    #maxdate = models.DateField(blank=True)
    addate = models.DateField(auto_now=True, blank=True)
    price = models.IntegerField(max_length=10, blank=True)
    responses = models.IntegerField(blank=True)

在forms.py中:

class AddOrderForm(forms.ModelForm):

    short_desc       = forms.CharField(widget=forms.TextInput,label="Краткое описание(послужит именем)")
    subject          = forms.ModelChoiceField(queryset=Subject.objects.all(), label="Предмет")
    worktype         = forms.ModelChoiceField(queryset=Type.objects.all(), label="Тип")
    level            = forms.IntegerField(widget=forms.TextInput,label="Уровень сложности (от 1 до 5)")
    description      = forms.CharField(widget=forms.TextInput,label="Полное описание")
    #maxdate          = forms.DateField(widget=forms.TextInput,label="maxdate")
    price            = forms.IntegerField(widget=forms.TextInput,label="Ваша цена")
    responses        = forms.IntegerField(widget=forms.TextInput,label="Кол-во ответов на заказ")

    class Meta:
        model = Order
        fields = ['short_desc',  'level', 'description', 'price', 'responses', 'subject', 'worktype']

在views.py中:

def addorder(request, user_id):
    """
    Adding Order view
    """
    if request.POST:
        form = AddOrderForm(request.POST)

        if form.is_valid():

            form.save()

            return redirect('/')


    else:
        return redirect('/')
    auth1 = auth.get_user(request).username
    return render_to_response('customer.html', { 'form': form,'username' : auth1}, context_instance=RequestContext(request))

我需要在 adding order() 之后立即初始化 class Order 中的字段 user_id。我应该在哪里以及以何种方式进行?我需要类似这样的逻辑:Client 通过AddOrderForm 添加一个Order,然后user_id 刚刚添加的class Order 对象的字段必须使用class Client 的对象进行初始化,其ID 等于@987654334 @在addorder()函数的参数中。

【问题讨论】:

  • 你有什么正当的理由为 integerField 使用 textInput 小部件吗?您可以使用详细名称,而不是重新定义表单中的所有字段。

标签: django forms views models


【解决方案1】:

您可以在保存表单时使用commit=False 执行此操作。这是使用具有较少字段的模型表单保存对象的典型方式。

def addorder(request, user_id):
    """
    Adding Order view
    """
    if request.POST:
        form = AddOrderForm(request.POST)

        if form.is_valid():

            order = form.save(commit=false)
            order.client_id = Client.objects.get(id=user_id)
            order.save()

            return redirect('/')


    else:
        return redirect('/')
    auth1 = auth.get_user(request).username
    return render_to_response('customer.html', 
             { 'form': form,'username' : auth1}, 
             context_instance=RequestContext(request))

免责声明:处理错误,例如Client.objects.get() 可能会失败。使用适当的字段进行搜索。

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2020-06-29
    • 1970-01-01
    • 2016-11-29
    • 2010-10-23
    • 1970-01-01
    • 2011-02-04
    • 2010-12-02
    • 2014-09-28
    相关资源
    最近更新 更多